C# 导入的程序集中的CoClass接口的确切用途是什么?
使用C# 导入的程序集中的CoClass接口的确切用途是什么?,c#,.net,com,com-interop,tlbimp,C#,.net,Com,Com Interop,Tlbimp,使用tlbimp.exe工具导入基本类型库始终会为每个coclass创建一个接口。例如,这个IDL描述 interface IFoo : IUnknown { HRESULT DoSomething(); } coclass Bar { [default] interface IFoo; } 结果: 接口IFoo作为COM接口的表示 一个类BarClass,作为COM类和 一个界面条,用CoClassAttribute注释 其中Bar和IFoo的guid相等。关于这一专题
tlbimp.exe
工具导入基本类型库始终会为每个coclass
创建一个接口。例如,这个IDL描述
interface IFoo : IUnknown
{
HRESULT DoSomething();
}
coclass Bar
{
[default] interface IFoo;
}
结果:
- 接口
作为COM接口的表示IFoo
- 一个类
,作为COM类和BarClass
- 一个界面
,用条
注释CoClassAttribute
Bar
和IFoo
的guid相等。关于这一专题的国家:
此接口与coclass的默认接口具有相同的IID。使用此接口,客户端可以始终注册为事件接收器
这是我在这个话题上发现的唯一东西。我知道,由于CoClassAttribute
,我可以使用接口创建实际类的实例。我还知道(实际上)我可以简单地使用BarClass
创建该类的新实例。我不明白的是,为什么导入过程会生成Bar
接口,即使coclass
没有定义事件源,因此没有事件接收器可以连接到它
在本例中,是否可以删除条
接口1,或者是否存在我尚未考虑的其他风险
例如,by.你的名字错了,这无助于理解发生了什么。类型库中的
Bar
coclass生成一个Bar
接口和一个BarClass
类,没有“FooBar”
这只是类型库自动生成的额外粘合剂,使移植代码更容易。对于VB6代码尤其重要的是,它对COM对象模型有很多自由度。VB6程序使用辅助类,就好像它是一个带有实现的真实类一样。COM中不存在这样的东西,coclass是类的不透明占位符,所有工作都是由接口完成的。VB6从来不支持接口的概念,因此在代码中直接建模COM是不可能的
VB6编译器本身根据代码中的Class关键字生成一个coclass,并生成一个携带实际方法和属性的接口。该接口是隐藏的,它具有与类相同的名称,但带有前导下划线。按照惯例,这会导致对象浏览器隐藏接口。因此,当用VB6编写Bar
coclass时,将生成\u Bar
接口
因此,经过转换的VB6程序将在任何地方使用Bar
。除非将“Bar”替换为“IFoo”,否则无法编译。合成的条
界面用于救援,避免了这种需要
还有两个问题需要解决,由合成的
BarClass
类型修复newbar()
将不会编译,因为创建接口实例是不合法的。编译器解决了这个问题,它自动将“Bar”替换为“BarClass”。这是[CoClass]属性的实际角色,它提供了与接口关联的类的名称。事件是一个问题,它们在COM中通过disp接口实现。同样是一个单独的接口,在引擎盖下有一个复杂的机制,用于订阅事件(IConnectionPoint等人)。合成的BarClass使它们成为真正的.NET事件。我已经确定了问题中的名称。谢谢你的回答!由于我没有移植VB6应用程序,而且上面的示例coclass没有定义事件,我认为您的回答意味着我可以删除接口,回答最后一句中的问题。如果我错了,请纠正我的错误!否则-感谢您的努力!:)