EDITAR: He escrito los resultados como una publicación de blog .
El compilador de C # trata los tipos COM de forma algo mágica. Por ejemplo, esta declaración parece normal ...
Word.Application app = new Word.Application();
... hasta que te das cuenta de que Application
es una interfaz. ¿Llamando a un constructor en una interfaz? Yoiks! Esto en realidad se traduce en una llamada a Type.GetTypeFromCLSID()
y otra a Activator.CreateInstance
.
Además, en C # 4, puede usar argumentos que no sean de referencia para los ref
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 muchos argumentos. ¿No son buenos los parámetros opcionales? :)
Estoy tratando de investigar el comportamiento del compilador, y no puedo 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 estallará en el momento de la ejecución, pero está bien. Solo estoy experimentando.
Los otros atributos agregados por el compilador para los PIA COM vinculados ( CompilerGenerated
y TypeIdentifier
) no parecen hacer el truco ... ¿cuál es la salsa mágica?
dynamic
... estamos demasiado acostumbrados al tipeo estático / fuerte para ver por qué sería importante fuera de COM.