W jaki sposób kompilator C # wykrywa typy COM?

EDYTOWAĆ: Napisałem wyniki jakopost na blogu.

Kompilator C # traktuje typy COM nieco magicznie. Na przykład to stwierdzenie wygląda normalnie ...

Word.Application app = new Word.Application();

... dopóki tego nie zrozumieszApplication jest interfejsem. Wywoływanie konstruktora na interfejsie? Yoiks! To faktycznie przekłada się na wezwanie doType.GetTypeFromCLSID() i inny doActivator.CreateInstance.

Dodatkowo w C # 4 można używać argumentów innych niż refref parametry, a kompilator po prostu dodaje zmienną lokalną do przekazania przez odniesienie, odrzucając wyniki:

// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");

(Tak, brakuje kilku argumentów. Czy opcjonalne parametry nie są ładne? :)

Próbuję zbadać zachowanie kompilatora i nie uda mi się sfałszować pierwszej części. Mogę wykonać drugą część bez problemu:

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);
    }
}

Chciałbym móc pisać:

Dummy dummy = new Dummy();

chociaż. Najwyraźniej wybuchnie w czasie wykonywania, ale w porządku. Po prostu eksperymentuję.

Inne atrybuty dodane przez kompilator dla połączonych PIA COM (CompilerGenerated iTypeIdentifier) nie wydaje się, że to sztuczka ... jaki jest magiczny sos?

questionAnswers(4)

yourAnswerToTheQuestion