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 Applicationeine 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 refParameter 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 ( CompilerGeneratedund 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.