编辑:我已经把结果写成了一篇博客文章。
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 PIAs添加的其他属性(CompilerGenerated
和TypeIdentifier
)似乎没有起作用......那么魔法酱汁是什么?
dynamic
的好用处...我们太习惯于静态/强类型,以至于看不出它在COM之外的重要性。 - chakrit