使用C#创建COM扩展-值得吗?
我正在处理以下问题:一个(第三方)软件( )我们正在广泛使用的是一个组件对象模型(COM)接口(实际上是几个接口),它允许编程它所谓的“扩展”。它提供了这些接口的MIDL文件以及VisualC++的“项目模板”作为SDK的一部分(IDL文件、头和接口已经存在,只是接口函数的实现缺失了)。为了便于兼容,所有扩展必须符合(即必须实现)给定的COM接口结构使用C#创建COM扩展-值得吗?,c#,com,interop,C#,Com,Interop,我正在处理以下问题:一个(第三方)软件( )我们正在广泛使用的是一个组件对象模型(COM)接口(实际上是几个接口),它允许编程它所谓的“扩展”。它提供了这些接口的MIDL文件以及VisualC++的“项目模板”作为SDK的一部分(IDL文件、头和接口已经存在,只是接口函数的实现缺失了)。为了便于兼容,所有扩展必须符合(即必须实现)给定的COM接口结构 不过,由于我对C++的熟悉相当有限,所以我希望在C.*和.NET中实现COM。另一方面,预定义的接口大量使用指针和自定义数据结构,因此,我想知道,
不过,由于我对C++的熟悉相当有限,所以我希望在C.*和.NET中实现COM。另一方面,预定义的接口大量使用指针和自定义数据结构,因此,我想知道,如果我在自己的C++中实现接口不是更好,而不是试图重新创建C中的所有东西。 可能还有一点背景知识:最终目标是从软件A内部控制一块定制硬件(通过USB)。我已经编写了一个小的.NET应用程序,使用DLLimport包装驱动程序(另一个第三方软件),它令人惊讶地毫不费力。换句话说,我试图构建的COM对象本质上是(第三方)软件a和(第三方)设备驱动程序B之间的桥梁,必须符合a给出的接口规范
MIDL代码示例: [id(0x00000004)]
HRESULT GetWaveData([in]BSTR名称,[out]IWaveData**数据)
[id(0x00000005)]
HRESULT GetImageData([in]BSTR名称,[out]IImageData**data,[out]调色板*调色板)
[id(0x00000006)]
HRESULT SetVariable([in]BSTR名称,[in]IVVariableData*变量);
如果不完全了解这个问题,就不可能回答这个问题。但一般来说,我会选择C++路径。通过向世界添加CLR,您将不得不在C#中处理互操作问题,并可能处理棘手的指针问题(因为它的本质是处理与低级硬件相关的东西)。因此,可能你的真正选择是不干净的C源或者与C++一起运行。我想我会选择后者。< P>技术上,你不是在C++中实现接口,而是在MIDL中实现。 这是一种独立的接口语言,如果您要进行COM工作,则值得了解 无论如何,使用.NET互操作来实现COM对象并不少见,但这两种技术并不真正兼容。除非你写的是非常简单的对象,否则你会遇到gotchas 为了让您开始,这里有一些随机分类的指针以及我在过去使用过的几篇文章
- COM是一种接口驱动技术。重复一遍又一遍
- 使用MIDL单独开发接口定义
- COM垃圾收集是确定性的(引用计数),但当与.NET一起使用时,它开始崩溃,在.NET中,垃圾收集自动且不可预测地发生
- 处理Eventsinks/事件处理程序很难
只有在.NET给您带来优势的情况下,您才应该使用它。例如,我们曾经需要webservices调用,而在.NET中对它的支持要好得多,所以我们就这样做了。在您的情况下,优势在于您更熟悉.NET,这可能值得选择 但是,如果在.NET中实现COM对象,则必须在必须使用该对象的每台计算机上要求.NET运行时。此外,实现自定义类型难以封送的接口时可能会遇到问题 您需要将优势(在您的案例中更加熟悉)与您遇到的技术负担(可能的部署和编组问题)进行比较
我个人的观点是,.NET路径只有在需要随时可用的功能(如webservices调用)时才可以选择。听起来您要做的决定是选择本机应用程序还是基于.NET的应用程序 您需要考虑以下几点: