C#编译器如何检测COM类型?
我已经将结果写为博客文章。
C#编译器以某种魔术方式对待COM类型。例如,此语句看起来很正常…
Word.Application app = new Word.Application();
…直到您意识到这Application
是一个界面。在接口上调用构造函数?ik!实际上,这会转化为的调用Type.GetTypeFromCLSID()
,另一个是的调用Activator.CreateInstance
。
此外,在C#4中,您可以对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
)添加的其他属性似乎并没有解决问题的方法……魔咒是什么?
回答:
我绝对不是这方面的专家,但是最近我偶然发现了我认为您想要的东西:CoClass属性类。
[System.Runtime.InteropServices.CoClass(typeof(Test))]public interface Dummy { }
协类提供一个或多个接口的具体实现。在COM中,可以使用支持COM组件开发的任何编程语言(例如Delphi,C ++,Visual
Basic等)编写此类具体实现。
请参阅我对有关Microsoft Speech
API的类似问题的回答,您可以在其中“实例化”该接口SpVoice
(但实际上,您正在实例化SPVoiceClass
)。
[CoClass(typeof(SpVoiceClass))]public interface SpVoice : ISpeechVoice, _ISpeechVoiceEvents_Event { }
以上是 C#编译器如何检测COM类型? 的全部内容, 来源链接: utcz.com/qa/398617.html