在C#中使用COM dll

3
我们有一个用C++编写的COM dll,被用于vb 6.0编写的应用程序中。我们公司计划在.NET平台上编写更新版本的应用程序。
就性能而言,在C#项目中使用COM dll,以下三个选项该如何选择?
1.只需将dll添加为com引用。 2.使用C++/Cli编写包装器dll。 3.使用TlbImp.exe生成包装器dll。
还有其他选项吗?谢谢。
4个回答

3
用C++/CLI编写包装器并不能提高速度,因为CLR中的COM互操作调用转换器已经被高度优化。当添加对COM服务器的引用时,它会自动生成机器码存根。这项工作涉及到异常等许多不易察觉且很难自己完成的任务。
它确保失败的HRESULT被正确转换为托管异常,并且托管异常不能泄漏到COM服务器代码中。如果只考虑速度而忽略了这些问题,那么你得到的将是快速但不可靠的结果。在非托管代码中捕获托管异常非常困难,所有上下文信息都会丢失。
选项1和3是相同的,两者都生成Interop库,IDE只是为你运行了Tlbimp的等效命令。
通常的建议是,先做简单的事情,Interop库非常简单。只有在真正出现性能问题并且有一个切实可行的解决方案时,才考虑实施真正困难的事情。我从未见过有人决定需要使用C++/CLI包装器。

1

选项2的性能更好,但并不是很明显,特别是考虑到DLL本身是VB6编写的。

不确定选项3是否有效。

我个人会选择选项1,但只需将互操作性保留在安全的位置,这样每次添加引用时就可以重复使用相同的互操作性而不必每次都创建它。

另一个选项是使用新的dynamic功能和后期绑定(使用Activator创建对象),但这肯定是所有选项中性能最差的。


DLL本身不是VB6编写的,但可以在使用VB6编写的应用程序中使用。 - ali_bahoo

1

由于该组件使用COM,将其作为引用添加并让Visual Studio构建代理将是最容易的。这对于.NET代码非常简单和透明。它可能不会像性能那样好,但很可能能够满足您的需求。我建议首先使用此方法,因为它非常简单,然后再查看其表现。

如果该组件不是COM组件,而只是标准的C++ DLL,则另外两种方法可能会更好。


0

由于数据的封送,调用COM速度较慢。当我说慢时,是与不跨越托管或COM边界的调用相比。

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

如果调用次数很少,或者它们不是性能关键的(但并非所有调用都是性能关键的?),那么我只需添加对COM dll的引用即可。

总结选择对COM dll的引用,并测试性能。由于您从VB6迁移,因此已经获得了巨大的性能提升(在.Net中处理字符串要快得多)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接