-1

我正在尝试将一组项目从 VB6 升级到 VB.NET 2.0。该项目包括一组库代码和应用程​​序代码。在升级之前,我的 VB6 应用程序代码将使用带有 ProgID 的标准机制 CreateObject() 加载我的库代码。

我有大约 8 个不同的库程序集,它们都有强名称,使用相同的 .NET 版本 (2.0),编译时兼容 x86,并且在 GAC 中。当我尝试使用 CreateObject 和 ProgID 加载我的库时,我收到 ActiveX 错误。我已经用 ADODB ("ADODB.Command") 进行了测试,它成功地抓取了 COM 对象。我不确定我做错了什么。

我也很困惑是否应该为库类使用 System.Runtime.Interop 类属性,或者是否应该将它们配置为 ComClass 实现。我也不确定是否需要在 AssemblyInfo.vb 文件中使用这些相同的属性。

我注意到的另一个区别是升级后的 vb 项目的 AssemblyInfo.vb 位于根目录中,而不是当我创建一个新项目并且它位于“MyProject”下时,这可能无关紧要,但我想提供我的所有信息能够。任何可以提供的帮助都会很棒。

谢谢!

4

1 回答 1

0

我并不是真正的 VB.NET 专家,但将属性放在你的类上、强命名和 GACing 都是你做对的事情。C# .NET 也需要这些东西,我对此很熟悉。

我认为您的问题是您已经设置了所有 VB.NET 代码,以便它创建一个可调用 COM 的包装器,但您实际上并没有向 COM 注册该包装器。像 ADODB 这样的普通 COM 组件可以正常工作,因为它们是在您的系统上安装组件时注册的。注册的 COM 组件与任何相关的 CLSID/ProgID 一起出现在您的 Windows 注册表中。您可以通过在您的注册表中搜索您的 ProgID 来确认这一点 - 我敢打赌它们丢失了,这就是您收到错误的原因。

基本上,您需要在流程中添加一个步骤。您需要通过 regasm.exe 运行您的程序集(与您放入 GAC 中的程序集相同)。该实用程序随 .NET 一起提供,旨在使注册过程变得非常简单。那里没有很多关于 VB.NET 和互操作的教程,但我确实发现这个可能足以让你摆脱困境。

还有这个链接- 它有一个标题为“在本机应用程序中包装托管对象”的部分。读一读,因为它本质上就是你正在做的事情。

我说“基本上”是因为在这种情况下,您正在构建 .NET 代码来加载其他一些 .NET 代码……使用 COM。如果您还没有走这条路,我会鼓励您完全避免使用 COM,而只使用 .NET 引用,完全跳过使用 ProgID 和 RegAsm 的整个业务。这有点像走了很长一段颠簸的弯路。你最终会得到一个可以工作的应用程序,但它会更难维护并且可能更慢。总之值得深思。

如果它帮助您解决问题,请不要忘记投票并接受此答案!谢谢 =)

于 2013-07-08T20:28:39.297 回答