最佳答案
编辑: 我把结果写成了 博客文章。
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
)添加的其他属性似乎没有起到作用... ... 有什么妙招?