¿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?