Как компилятор C # обнаруживает типы COM?
EDIT: Я записал результаты какСообщение блога.
Компилятор C # обрабатывает COM-типы магическим образом. Например, это утверждение выглядит нормально ...
Word.Application app = new Word.Application();
... пока не поймешь, чтоApplication
это интерфейс. Вызов конструктора для интерфейса? Йойку! Это на самом деле переводится в вызовType.GetTypeFromCLSID()
и другой, чтобыActivator.CreateInstance
.
Кроме того, в C # 4 вы можете использовать не-ref аргументы дляref
параметров, и компилятор просто добавляет локальную переменную для передачи по ссылке, отбрасывая результаты:
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(Да, пропущено множество аргументов. Не являются ли необязательные параметры хорошими? :)
Я пытаюсь исследовать поведение компилятора, и мне не удается подделать первую часть. Я могу сделать вторую часть без проблем:
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
[ComImport, GuidAttribute("00012345-0000-0000-0000-000000000011")]
public interface Dummy
{
void Foo(ref int x);
}
class Test
{
static void Main()
{
Dummy dummy = null;
dummy.Foo(10);
}
}
Я хотел бы иметь возможность написать:
Dummy dummy = new Dummy();
хоть. Очевидно, что во время исполнения все будет в порядке, но это нормально. Я просто экспериментирую.
Другие атрибуты, добавленные компилятором для связанных COM PIA (CompilerGenerated
а такжеTypeIdentifier
Кажется, что не получается ... что за волшебный соус?