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?

questionAnswers(4)

yourAnswerToTheQuestion