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?