2010-11-05 111 views
2

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

至于表现而言,在C#项目使用COM DLL时,我应该从下面

  1. 列出的3个选项中只需添加DLL作为一个COM参考
  2. 写作选择一个包装DLL使用C++/CLI
  3. 生成使用TLBIMP.EXE

还是有什么其他选择的包装DLL?
谢谢。

回答

2

在C++/CLI中编写包装的速度可能不会更快,因此CLR中的COM互操作编组器大大优化。它会在您添加对COM服务器的引用时创建的互操作库中自动生成机器代码存根。 A做了很多更隐蔽的工作,很难做到,例外。

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

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

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

1

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

不确定选项3是否可用。

我会亲自使用选项1,但只是保持interop安全的地方,以便我只是不断重复使用相同的互操作,而不是每次添加参考时都创建它。

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

+0

DLL本身不在VB6中,但用于用VB6编写的应用程序 – 2010-11-05 13:56:57

0

由于对数据进行编组,所以对COM的调用很慢。我的意思是说,与没有跨越托管或COM边界的呼叫相比,我的意思很慢。

如果您需要对COM组件进行很多小型调用,那么在您的应用程序中性能至关重要的部分,您可以将它们与C++一起打包(和组合)。

如果调用次数最少,或者它们不是性能关键(但并非所有调用性能都很关键?),我只需简单地添加一个对COM DLL的引用。

摘要转到COM DLL的指定,并测试性能。既然你从VB6迁移,你将会获得一个令人满意的性能提升(在.Net中的字符串处理非常快)。

1

由于组件正在使用COM,因此将其作为参考添加它并将其作为参考,并让Visual Studio构建代理是最容易的。这对.NET代码来说是非常直接和透明的。它不会像表演一样,但很可能会满足您的需求。我会先做这件事,因为它很容易,然后看它是如何执行的。

如果组件不是一个COM组件,并且只是一个标准的C++ dll,那么另外两个方法可能是一个更好的选择。