Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 导入的程序集中的CoClass接口的确切用途是什么?_C#_.net_Com_Com Interop_Tlbimp - Fatal编程技术网

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;
}
结果:

  • 接口
    IFoo
    作为COM接口的表示
  • 一个类
    BarClass
    ,作为COM类和
  • 一个界面
    ,用
    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没有定义事件,我认为您的回答意味着我可以删除接口,回答最后一句中的问题。如果我错了,请纠正我的错误!否则-感谢您的努力!:)