EDIT: Ich habe die Ergebnisse als Blog-Beitrag geschrieben .
Der C # -Compiler behandelt COM-Typen etwas magisch. Zum Beispiel sieht diese Aussage normal aus ...
Word.Application app = new Word.Application();
... bis Sie erkennen, dass dies Application
eine Schnittstelle ist. Einen Konstruktor auf einer Schnittstelle aufrufen? Yoiks! Dies wird tatsächlich in einen Anruf an Type.GetTypeFromCLSID()
und einen anderen an übersetzt Activator.CreateInstance
.
Darüber hinaus können Sie in C # 4 Nicht-Ref-Argumente für ref
Parameter verwenden, und der Compiler fügt lediglich eine lokale Variable hinzu, die als Referenz übergeben werden soll, und verwirft die Ergebnisse:
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(Ja, es fehlen eine Reihe von Argumenten. Sind optionale Parameter nicht nett? :)
Ich versuche, das Verhalten des Compilers zu untersuchen, und ich kann den ersten Teil nicht vortäuschen. Ich kann den zweiten Teil ohne Probleme machen:
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);
}
}
Ich möchte schreiben können:
Dummy dummy = new Dummy();
obwohl. Natürlich wird es zur Ausführungszeit knallen, aber das ist okay. Ich experimentiere nur.
Die anderen Attribute, die der Compiler für verknüpfte COM PIAs ( CompilerGenerated
und TypeIdentifier
) hinzugefügt hat, scheinen nicht den Trick zu tun ... Was ist die magische Sauce?
dynamic
... finden. Wir sind einfach zu sehr an statisches / starkes Tippen gewöhnt, um zu sehen, warum es außerhalb von COM wichtig ist.