编辑:我已经将结果写为博客文章。
C#编译器在某种程度上神奇地对待COM类型。例如,此语句看起来很正常...
Word.Application app = new Word.Application();
...直到您意识到这Application
是一个界面。在接口上调用构造函数?ik!实际上,这会转换为的调用Type.GetTypeFromCLSID()
,另一个是的调用Activator.CreateInstance
。
此外,在C#4中,您可以使用非引用参数作为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之外为何如此重要。