Wie erkennt der C # -Compiler COM-Typen?
BEARBEITEN: Ich habe die Ergebnisse als geschriebenBlogeintrag.
Der C # -Compiler behandelt COM-Typen etwas magisch. Zum Beispiel sieht diese Aussage normal aus ...
Word.Application app = new Word.Application();
... bis Sie das merkenApplication
ist eine Schnittstelle. Aufruf eines Konstruktors auf einer Schnittstelle? Yoiks! Dies wird tatsächlich in einen Aufruf an übersetztType.GetTypeFromCLSID()
und ein anderer zuActivator.CreateInstance
.
Darüber hinaus können Sie in C # 4 Argumente ohne Verweis für verwendenref
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 einige Argumente. 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 hinzugefügt hat (CompilerGenerated
undTypeIdentifier
) Scheint den Trick nicht zu tun ... Was ist die magische Sauce?