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?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage