0

我有一个 C++ 和 VB6 中的 COM 对象,一切都是使用 Visual Studio 2003 编译和打包的。C++ 生成 DLL,VB6 生成 EXE,所以从遗留代码中我可以调用调用 DLL 的 EXE 等等。

我需要将这些迁移到 Visual Studio 2008。但是,我有一些问题

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

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

用 C++ 编译并在 VB.net 中加载添加引用?我试过这个,但DLL没有加载............

4

3 回答 3

1

听起来你的 C++ DLL 是一个普通的 DLL(不是 COM),VB6 usingDeclare语句可以访问它。

你有两个选择。

  • 您可以使用P/Invoke直接从 .Net 调用 C++ DLL 。无需对 C++ 进行代码更改,您可以使用现有的 DLL。您可以使用P/Invoke Interop Assistant从 C++ 的标头中自动生成 P/Invoke 代码。
  • 如果您愿意更改 C++,您也可以使用C++ Interop,据说实现起来不那么繁琐。
于 2010-11-09T12:36:49.690 回答
1

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

如果 VB 代码是客户端,您可以将其构建为 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++ 的便捷方式。但是,第二个可能会给您带来一些麻烦。

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

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

于 2010-11-09T05:39:24.707 回答
1

好的,您似乎有一个轻微的误解。.net 是与 COM/VB 完全不同的环境。它们是所谓的非托管代码,而 .net 是托管的。您可以使用称为 InterOp 的东西从一个呼叫到另一个呼叫(并且有多种类型)。

第一个 vb6 - 要将其转换为 .net,您需要重新编码应用程序。.net 不是 VB。虽然语言相似。

.net 也不是活动的 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 接口。
  4. 放手不管
于 2010-11-09T05:46:02.200 回答