.NET 声明COM接口

(本人业余程序员一枚,本文内容均为个人观点,有不恰当的地方欢迎随时指正,不欢迎喷粪,谢谢!)

.NET中,接口(Interface)是一种特殊的类型。使用接口可以规范不同类方法的调用,更好的实现程序的模块化。.NET Framework功能强大,支持COM组件的编写。使用VB.NET或C#等语言,开发者即可快速开发高质量的COM组件。

编写COM组件,需要给COM组件类实现相应的COM接口。但是绝大多数的COM接口并未在.NET Framework当中定义,所以需要开发者自己来实现。

COM(C++)实际上并不支持接口,众所周知,在C++中所谓的接口实际上是结构体(struct)当中定义了一系列虚函数,指定需要实现此“接口”的类需要挨个实现这些虚函数才完成这个接口的实现。因此,C++中所有有关接口的概念全都是模拟出来的,包括接口的继承。也就是说,COM接口的继承关系是模拟出来的,只是在C++代码中看起来像是继承了。而实际上,COM接口之间感觉上是相互独立的,每一个接口都是完整的结构。这么说话似乎并不容易懂,下面我上代码。

<Guid("0000010C-0000-0000-C000-000000000046")>
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
<ComImport>
Public Interface IPersist
    <MethodImpl(MethodImplOptions.InternalCall, MethodCodeType:=MethodCodeType.Runtime)>
    Sub GetClassID(ByRef pClassID As Guid)
End Interface

上面是IPersist接口在.NET中的定义。三个附加特性(Attribute)分别表明了接口IID、接口类型和表明此接口是事先在COM当中定义好的。接口中有1个方法,实现就行了。

下面情况更复杂了,成员增多,也有了继承关系。

<Guid("00000109-0000-0000-C000-000000000046")>
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
<ComImport>
Public Interface IPersistStream
    Inherits IPersist
    <MethodImpl(MethodImplOptions.InternalCall, MethodCodeType:=MethodCodeType.Runtime)>
    Shadows Sub GetClassID(ByRef pClassID As Guid)

    <MethodImpl(MethodImplOptions.InternalCall, MethodCodeType:=MethodCodeType.Runtime)>
    Sub IsDirty()

    <MethodImpl(MethodImplOptions.InternalCall, MethodCodeType:=MethodCodeType.Runtime)>
    Sub Load(<MarshalAs(UnmanagedType.[Interface]), [In]> pstm As IStream)

    <MethodImpl(MethodImplOptions.InternalCall, MethodCodeType:=MethodCodeType.Runtime)>
    Sub Save(<MarshalAs(UnmanagedType.[Interface]), [In]> pstm As IStream, <[In]> fClearDirty As Integer)

    <MethodImpl(MethodImplOptions.InternalCall, MethodCodeType:=MethodCodeType.Runtime)>
    Sub GetSizeMax(pcbSize As ULong)
End Interface

注意了,继承来的成员需要按顺序重新定义,否则COM将不能识别。这是因为.NET中Interface是真继承,而COM中是假继承。COM接口继承是直接将继承的成员原封不动的放在自己成员的前面,和自己的成员一起可访问;而.NET接口继承则不是这样,使用Type.GetMembers你找不到继承自的成员。所以,我们需要重新定义成员函数来占位,这样才能让COM接口在执行时正确的“对号入座”。

说白了,COM接口实际上就是一个函数指针数组(void**),保证数量、顺序和参数一一对应即可,函数名称、参数名称甚至接口名称都不是重点,接口有IID来识别。

本文参考来自Code Project的文章,洋文6的朋友可以看看这里。

另外神站pinvoke.net也是不可多得的臂助,给不知道的小白们介绍下。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《精通.net互操作:P/Invoke、C Interop和COM Interop》是一本关于.net平台下不同互操作技术的书籍。 书中首先介绍了P/Invoke技术。P/Invoke(Platform Invoke)是一种在.net中调用非托管代码的技术。它通过声明DllImport特性并指定非托管函数的名称、返回类型、参数类型等信息,来让.net应用程序调用非托管DLL中的函数。这种方式可以方便地与已有的C/C++代码进行整合,扩展.net平台的功能。 然后,书中探讨了C Interop技术,即C语言互操作技术。C Interop主要包括两种形式:Managed C++和C++/CLI。Managed C++允许在.net应用程序中混合使用C++和C#代码,并通过提供的语言扩展和编译选项实现两者之间的互操作。C++/CLI是使用C++/CLI语言编写的.net应用程序,它提供了一种丰富的语法和特性,使得C++与CLR之间的交互更加便捷。 最后,书中介绍了COM Interop技术。COM Interop是一种用于在.net中与COM组件进行互操作的技术。通过使用COM Interop,可以将COM组件包装为.net可调用的对象,使得.net应用程序可以通过接口调用COM组件的功能,并在运行时处理COM对象的生命周期管理。 《精通.net互操作:P/Invoke、C Interop和COM Interop》深入介绍了这三种互操作技术的原理、用法和注意事项,并结合示例代码和实际应用场景进行讲解。这本书对于想要在.net平台下进行跨平台、跨语言的开发人员来说,是一本非常有价值的学习资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值