¿Cómo el compilador de C # detecta los tipos COM?

EDITAR: He escrito los resultados comoentrada en el blog.

El compilador de C # trata los tipos COM de forma mágica. Por ejemplo, esta declaración parece normal ...

Word.Application app = new Word.Application();

... hasta que te des cuenta de esoApplication es una interfaz ¿Llamando a un constructor en una interfaz? Yoiks! Esto realmente se traduce en una llamada aType.GetTypeFromCLSID() y otro paraActivator.CreateInstance.

Además, en C # 4, puede usar argumentos no-ref pararef parámetros, y el compilador simplemente agrega una variable local para pasar por referencia, descartando los resultados:

// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");

(Sí, faltan algunos argumentos. ¿No son agradables los parámetros opcionales? :)

Estoy tratando de investigar el comportamiento del compilador, y estoy fallando en falsificar la primera parte. Puedo hacer la segunda parte sin problema:

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);
    }
}

Me gustaría poder escribir:

Dummy dummy = new Dummy();

aunque. Obviamente, funcionará en el momento de la ejecución, pero está bien. Sólo estoy experimentando.

Los otros atributos agregados por el compilador para PIA COM vinculados (CompilerGenerated yTypeIdentifier) no parecen hacer el truco ... ¿cuál es la salsa mágica?

Respuestas a la pregunta(4)

Su respuesta a la pregunta