EDIT: Я написал результаты в виде сообщения .
Компилятор С# обрабатывает типы COM несколько волшебным образом. Например, это утверждение выглядит нормально...
Word.Application app = new Word.Application();
... пока вы не поймете, что Application - это интерфейс. Вызов конструктора на интерфейсе? Йойку! Это фактически переводится в вызов Type.GetTypeFromCLSID(), а другой - Activator.CreateInstance.
Кроме того, в С# 4 вы можете использовать аргументы non-ref для параметров ref, а компилятор просто добавляет локальную переменную для передачи по ссылке, отбрасывая результаты:
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(Да, есть недостаток аргументов. Не являются ли дополнительные параметры приятными?:)
Я пытаюсь исследовать поведение компилятора, и я не могу подделать первую часть. Я могу сделать вторую часть без проблем:
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);
    }
}
Я бы хотел написать:
Dummy dummy = new Dummy();
хотя. Очевидно, что это пойдет во время исполнения, но все в порядке. Я просто экспериментирую.
Другие атрибуты, добавленные компилятором для связанных COM PIA (CompilerGenerated и TypeIdentifier), похоже, не делают трюк... какой волшебный соус?
