Как компилятор 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Кажется, что не получается ... что за волшебный соус?

Ответы на вопрос(4)

Ваш ответ на вопрос