Como o compilador C # detecta tipos COM?
EDITAR: Eu escrevi os resultados como umpostagem no blog.
O compilador C # trata tipos de COM um pouco magicamente. Por exemplo, esta afirmação parece normal ...
Word.Application app = new Word.Application();
... até você perceber queApplication
é uma interface. Chamando um construtor em uma interface? Yoiks! Isso realmente é traduzido em uma chamada paraType.GetTypeFromCLSID()
e outro paraActivator.CreateInstance
.
Além disso, no C # 4, você pode usar argumentos não refref
parâmetros, eo 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, há um monte de argumentos em falta. Os parâmetros opcionais não são legais? :)
Estou tentando investigar o comportamento do compilador e não estou conseguindo falsificar a primeira parte. Eu posso fazer a segunda parte sem 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, isso vai acontecer em tempo de execução, mas tudo bem. Eu estou apenas experimentando.
Os outros atributos adicionados pelo compilador para COM PIAs vinculados (CompilerGenerated
eTypeIdentifier
) não parece fazer o truque ... qual é o molho mágico?