首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将c++ vb6 COM对象转换为. net

将c++ vb6 COM对象转换为. net
EN

Stack Overflow用户
提问于 2010-11-09 13:27:12
回答 3查看 935关注 0票数 0

我在C++和VB6中有一个COM对象,所有东西都是使用Visual Studio2003编译和打包的。C++生成DLL,然后VB6 EXE,所以我可以从遗留代码中调用调用DLL的EXE,依此类推。

我需要将这些迁移到Visual Studio2008。然而,我有一些问题

1)我可以编译C++并生成动态链接库-(我认为还可以) 2) VB.Net不再有生成COM/ActviveX作为VB6的选项,所以不知道-我试图生成windows exe并调用动态链接库,但它不起作用。我想是因为它有一些COM调用。

那么,摆脱COM/ActiveX并交付一些东西的最佳解决方案是什么呢?

在C++中编译并在VB.net中加载添加引用?我试过了,但DLL无法加载.........

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-09 13:39:25

您尚未阐明VB代码是进程外COM服务器还是使用C++ inproc COM对象的客户端。

如果VB代码是客户端,则可以使用build it作为VB.Net可执行文件,同时使用对coclass的COM引用,或者如果不希望在生成过程中注册C++对象,则可以使用类型库上的TlbImp工具生成托管互操作程序集,以便从VB.Net代码引用。

如果您的VB.Code是进程外COM服务器,则必须使用COMVisible属性标记希望通过COM获得信任的类,然后使用RegAsm工具向COM注册程序集。

另一种方法是将C++代码编译为托管C++,然后从VB代码中将其作为标准托管程序集进行引用。这种方法的优点是,您将完全绕过COM互操作层,完全停留在托管环境中,这具有某些完美的好处。另一方面,有两个缺点- a)你的C++代码只能被那个特定的客户端访问,除非你把它放到GAC中,b)编写托管C++将需要一些额外的工作。我不认为第一个问题会影响到您,因为在您的场景中,听起来COM只是作为一种从VB6代码过渡到低级C++的便捷方法。然而,第二个可能会给你带来一些麻烦。

更新:根据您的注释更新,似乎实际上您有一个C++代码,它直接从VB代码调用,而该代码又通过COM从其他客户端调用。

如果确实是这样,那么我的建议是将VB6代码重新编译为VB.Net (您可能需要对代码进行一些更改,因为两个平台并不完全相同),并使用COMVisible将其公开为COM对象,然后使用P/Invoke来使用当前的C++代码(这与当前VB6代码使用它的方式非常相似)。应该不需要将C++重新编译为托管C++组件。

票数 1
EN

Stack Overflow用户

发布于 2010-11-09 13:46:02

好的,你看起来有点误会。.net是一个与COM/VB完全不同的环境。它们是所谓的非托管代码,而.net是托管的。您可以使用称为InterOp的东西从一个调用到另一个(有很多种类型)。

First vb6 -要将其转换为.net,您需要对应用程序进行重新编码。.net不是VB。虽然语言是相似的。

.net也不是active X。不能简单地将c++ dll (com或其他格式)重新编译为.net。但是,有一个称为托管C++的特殊版本的C++,它位于托管代码和非托管代码之间。

您有以下选项。

  1. 重新编码VB程序并使用vb.net中的COM InterOp访问现有COM对象
  2. 重新编码VB程序并重新编码COM功能(托管C++或重新编码为VB.net)以完全独立.net
  3. 退出VB程序并重新编码COM功能(托管C++或重新编码为VB.net)以完全.net并使用.net的功能公开COM all alone
票数 1
EN

Stack Overflow用户

发布于 2010-11-09 20:36:50

听起来您的C++动态链接库就像是一个普通的动态链接库(而不是COM),并且VB6可以使用Declare语句访问它。

您有两个选择。

  • 您可以使用P/Invoke直接从.Net调用Invoke DLL。不需要对C++进行代码更改,您可以使用现有的DLL。您可以使用P/Invoke Interop Assistant从C++的标头自动生成P/Invoke代码。
  • 如果你愿意改变C++,你也可以使用,它的实现应该不那么繁琐。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4130785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档