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
), похоже, не делают трюк... какой волшебный соус?