gpt4 book ai didi

c# - 导入程序集中的 CoClass 接口(interface)到底是做什么用的?

转载 作者:太空狗 更新时间:2023-10-29 21:39:31 24 4
gpt4 key购买 nike

使用tlbimp.exe 工具导入基本类型库总是会为每个coclass 创建一个接口(interface)。例如这个 IDL 描述

interface IFoo : IUnknown
{
HRESULT DoSomething();
}

coclass Bar
{
[default] interface IFoo;
}

结果:

  • 接口(interface) IFoo 作为 COM 接口(interface)的表示,
  • BarClass 作为 COM coclass 的表示和
  • 接口(interface) Bar,用 CoClassAttribute 注释。

其中 BarIFoo 的 GUID 相等。 MSDN关于这个主题的陈述:

This interface has the same IID as the default interface for the coclass. With this interface, clients can always register as event sinks.

这是我在这个主题上唯一找到的东西。我知道,由于 CoClassAttribute,我可以使用接口(interface)创建实际类的实例。我也知道(实际上)我可以简单地使用 BarClass 创建该类的新实例。我不明白的是,为什么导入过程生成 Bar 接口(interface),即使 coclass 没有定义事件源,因此没有事件接收器可以连接到它。

是否可以删除此示例中的 Bar 接口(interface) 1 或是否存在其他风险,我尚未考虑?

1 例如disassembling the interop assembly .

最佳答案

你把名字弄错了,这无助于理解发生了什么。类型库中的Bar coclass生成了一个Bar接口(interface)和一个BarClass类,没有“FooBar”。

这只是类型库自动生成的额外胶水,使移植代码更容易。对于 VB6 代码特别重要,它对 COM 对象模型进行了很多改动。 VB6 程序使用 coclass 就好像它是具有实现的真实类一样。 COM 中不存在这样的东西,coclass 是类的不透明占位符,它是完成所有工作的接口(interface)。 VB6 从不支持接口(interface)的概念,因此无法在代码中直接对 COM 建模。

VB6编译器本身会根据代码中的Class关键字生成coclass,并生成承载实际方法和属性的接口(interface)。该接口(interface)是隐藏的,它具有与类相同的名称但前导下划线。按照惯例,这会导致对象浏览器隐藏界面。所以当用 VB6 编写时,您的 Bar 组件类将生成一个 _Bar 接口(interface)。

因此,转换后的 VB6 程序将在所有地方使用 Bar。除非“Bar”被“IFoo”替换,否则这不会编译。合成的 Bar 接口(interface)来拯救,避免了对它的需要。

还有两个问题需要解决,由合成 BarClass 类型修复。 New Bar() 不会编译,因为创建接口(interface)实例是不合法的。编译器解决了这个问题,它自动用“BarClass”替换“Bar”。这就是[CoClass]属性的实际作用,它为与接口(interface)关联的类提供名称。事件是一个问题,它们是通过调度接口(interface)在 COM 中实现的。又是一个单独的接口(interface),在引擎盖下有一个复杂的机制来订阅事件(IConnectionPoint 等)。合成的 BarClass 使它们成为真正的 .NET 事件。

关于c# - 导入程序集中的 CoClass 接口(interface)到底是做什么用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20907174/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com