Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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#创建COM扩展-值得吗?_C#_Com_Interop - Fatal编程技术网

使用C#创建COM扩展-值得吗?

使用C#创建COM扩展-值得吗?,c#,com,interop,C#,Com,Interop,我正在处理以下问题:一个(第三方)软件( )我们正在广泛使用的是一个组件对象模型(COM)接口(实际上是几个接口),它允许编程它所谓的“扩展”。它提供了这些接口的MIDL文件以及VisualC++的“项目模板”作为SDK的一部分(IDL文件、头和接口已经存在,只是接口函数的实现缺失了)。为了便于兼容,所有扩展必须符合(即必须实现)给定的COM接口结构 不过,由于我对C++的熟悉相当有限,所以我希望在C.*和.NET中实现COM。另一方面,预定义的接口大量使用指针和自定义数据结构,因此,我想知道,

我正在处理以下问题:一个(第三方)软件( )我们正在广泛使用的是一个组件对象模型(COM)接口(实际上是几个接口),它允许编程它所谓的“扩展”。它提供了这些接口的MIDL文件以及VisualC++的“项目模板”作为SDK的一部分(IDL文件、头和接口已经存在,只是接口函数的实现缺失了)。为了便于兼容,所有扩展必须符合(即必须实现)给定的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/事件处理程序很难
您可能会遇到的头痛类型:

有关为什么不应让Visual Studio自动生成COM接口的详细信息:

桥接事件:

只有在.NET给您带来优势的情况下,您才应该使用它。例如,我们曾经需要webservices调用,而在.NET中对它的支持要好得多,所以我们就这样做了。在您的情况下,优势在于您更熟悉.NET,这可能值得选择

但是,如果在.NET中实现COM对象,则必须在必须使用该对象的每台计算机上要求.NET运行时。此外,实现自定义类型难以封送的接口时可能会遇到问题

您需要将优势(在您的案例中更加熟悉)与您遇到的技术负担(可能的部署和编组问题)进行比较


我个人的观点是,.NET路径只有在需要随时可用的功能(如webservices调用)时才可以选择。

听起来您要做的决定是选择本机应用程序还是基于.NET的应用程序

您需要考虑以下几点:

  • 部署问题:您将在哪里部署此应用程序?它是可以在数百台工作站上运行,还是仅仅在几个工作站上运行?您对安装它的机器有多大的控制权?请记住,您必须确保安装了正确版本的.NET平台

  • 维护问题:您显然更熟悉.NET,但从长远来看,谁将负责该应用程序?他们会被期待熟悉C++吗?本地开发确实与管理开发不同,因为“内务管理”是其中非常重要的一部分

  • 第三方依赖关系:我觉得您好像在尝试使用第三方COM库通过USB与设备通信。但是,您已经提到,您已经为硬件驱动程序编写了一个.NET包装器——您可以详细说明一下吗,因为这有点让人困惑。如果可能,如果没有太多麻烦,不要引入依赖关系

  • 资源约束:如果您的应用程序将“在野外”安装,那么硬件约束是什么?使用非托管环境编程允许您细粒度地控制应用程序将使用的内存量以及CPU密集度——当然,这是与让托管层负责资源管理的权衡

  • 通常,如果您开发的应用程序不需要部署到数千个具有不同硬件配置的用户,那么