Edição: Eu escrevi os resultados como um post no blog .
O compilador C # trata os tipos COM de maneira um pouco mágica. Por exemplo, esta declaração parece normal ...
Word.Application app = new Word.Application();
... até você perceber que Application
é uma interface. Chamando um construtor em uma interface? Yoiks! Na verdade, isso é traduzido em uma chamada para Type.GetTypeFromCLSID()
e outra para Activator.CreateInstance
.
Além disso, no C # 4, você pode usar argumentos não-ref para ref
parâmetros, e o compilador apenas adiciona uma variável local para passar por referência, descartando os resultados:
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(Sim, faltam vários argumentos. Os parâmetros opcionais não são bons? :)
Estou tentando investigar o comportamento do compilador e não estou conseguindo falsificar a primeira parte. Eu posso fazer a segunda parte sem nenhum 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);
}
}
Eu gostaria de poder escrever:
Dummy dummy = new Dummy();
Apesar. Obviamente, vai estragar no momento da execução, mas tudo bem. Estou apenas experimentando.
Os outros atributos adicionados pelo compilador para PIAs COM vinculados ( CompilerGenerated
e TypeIdentifier
) não parecem fazer o truque ... qual é o molho mágico?
dynamic
... estamos acostumados a digitar estático / forte para ver por que isso importa fora do COM.