РЕДАКТУВАННЯ: Результати я записав як повідомлення в блозі .
Компілятор C # трактує типи COM дещо магічно. Наприклад, це твердження виглядає нормально ...
Word.Application app = new Word.Application();
... поки ви не зрозумієте, що Application
це інтерфейс. Викликає конструктор через інтерфейс? Йойки! Це насправді перетворюється на заклик до Type.GetTypeFromCLSID()
іншого Activator.CreateInstance
.
Крім того, у C # 4 ви можете використовувати аргументи, які не мають 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
), схоже, не роблять фокусу ... що таке чарівний соус?
dynamic
... ми просто занадто звикли до статичного / сильного набору тексту, щоб зрозуміти, чому це має значення поза COM.