C#编译器如何检测COM类型?
C#编译器有点神奇地处理COM类型。例如,这个陈述看起来很正常......
Word.Application app = new Word.Application();
......直到你意识到这Application
是一个界面。在接口上调用构造函数?Yoiks!这实际上被转换为对Type.GetTypeFromCLSID()
另一个的调用Activator.CreateInstance
。
此外,在C#4中,您可以对ref
参数使用非ref 参数,并且编译器只是添加一个局部变量以通过引用传递,丢弃结果:
// FileName parameter is *really* a ref parameterapp.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
)添加的其他属性似乎没有做到这一点......什么是神奇的酱油?
Helenr
芜湖不芜
ITMISS
相关分类