在C#中使用COM dll

时间:2010-11-05 13:35:28

标签: c# c++ com dll wrapper

我们有COM dll,它是用C ++编写的,并且已被vb 6.0中编写的应用程序使用。我的公司计划在.Net平台上编写更新版本的应用程序。

就性能而言,在C#项目中使用COM dll时,我应该从下面列出的3个选项中选择什么

  1. 只需将dll添加为com参考
  2. 用C ++ / Cli编写包装器dll
  3. 使用TlbImp.exe生成包装器dll
  4. 或者还有其他选择吗?
    感谢。

4 个答案:

答案 0 :(得分:3)

在C ++ / CLI中编写包装器的速度可能不会更快,CLR中的COM互操作编组器已经过大量优化。它从您添加对COM服务器的引用时创建的互操作库自动生成机器代码存根。 A做了很多与异常相关的非常隐形且很难做的工作。

它确保将HRESULT失败正确转换为托管异常,并且托管异常不会泄漏到COM服务器代码中。当你这样做时,你会有“快速”的决心,这会让你像这样偷工减料。现在你有了快速但不可靠的东西。在非托管代码中获取托管异常非常难以诊断,所有上下文都消失了。

选项1和3是相同的。两者都生成互操作库,IDE只为您运行等效的Tlbimp。

通常的指导适用于此。首先,简单的事情是,互操作库非常简单。只有在你能够真正测量性能问题时才考虑做真正的困难有一个现实的想法如何处理它。我从来没有见过任何人认为必须使用C ++ / CLI包装器。

答案 1 :(得分:1)

选项2性能更高,但并不多,特别是考虑到DLL本身在VB6中。

不确定选项3是否有效。

我个人会使用选项1,但只是保持互操作安全,这样我就可以继续重复使用相同的互操作,而不是每次添加引用时都不创建它。

另一种选择是使用新的dynamic功能和后期绑定(使用Activator来创建对象),但这绝对不是所有功能。

答案 2 :(得分:1)

由于组件使用COM,因此最简单的方法是将其添加为引用,并让visual studio构建代理。对于.net代码,这将是非常直接和透明的。它不会那么高效,但很可能它会满足您的需求。我会先这样做,因为它很容易,然后看看它是如何表现的。

如果组件不是COM组件,而只是标准的c ++ dll,那么另外两种方法可能是更好的选择。

答案 3 :(得分:0)

由于数据的编组,对COM的调用很慢。我的意思是缓慢,与你没有跨越Managed或COM边界的调用相比。

如果需要对COM组件进行大量小调用,在应用程序的性能关键部分中,可以使用C ++包装(并组合)它们。

如果呼叫次数最少,或者它们不是性能关键(但并非所有呼叫性能都很关键?)我只想添加对COM dll的引用。

摘要转到COM dll的refence,并测试性能。从VB6迁移后,您将获得极大的性能提升(.Net中的字符串处理速度更快)。