我正在尝试将一组项目从VB6升级到VB.NET 2.0。该项目包括一组库代码和应用程序代码。在升级之前,我的VB6应用程序代码将使用带有ProgID的标准机制CreateObject()加载我的库代码。
我有大约8个不同的库程序集,它们都具有强名称,使用相同的.NET版本(2.0),使用x86兼容性编译,并且在GAC中。当我尝试使用CreateObject和我的ProgIDs加载我的库时,我收到一个ActiveX错误。我已经使用ADODB(“ADODB.Command”)进行了测试,并成功获取了COM对象。我不确定我做错了什么。
我也很困惑我是否应该为库类使用System.Runtime.Interop类属性,或者我是否应该将它们配置为ComClass实现。我也不确定是否需要在AssemblyInfo.vb文件中使用这些相同的属性。
我注意到的另一个区别是已升级的vb项目的AssemblyInfo.vb位于根目录中,而不是当我创建一个新项目并且它位于“MyProject”下时,可能无关紧要,但我想提供所有我可以的信息。可以提供的任何帮助都很棒。
谢谢!
答案 0 :(得分:0)
我并不是VB.NET的专家,但是将这个属性放在你的课堂上,强大的命名和GACing都是你做得对的。这些东西也是C#.NET所必需的,我熟悉它。
我认为你的问题是你已经设置了所有的VB.NET代码,这样它就可以生成一个COM可调用的包装器,但你实际上没有用COM注册该包装器。像ADODB这样的库存COM组件可以工作,因为它们是在系统上安装组件时注册的。已注册的COM组件与任何相关的CLSID / ProgID一起出现在Windows注册表中。您可以通过在注册表中搜索您的ProgID来确认这一点 - 我打赌它们会丢失,这就是您收到错误的原因。
基本上,您需要在流程中添加一个步骤。您需要通过regasm.exe运行程序集(与GAC相同的程序集)。此实用程序随.NET一起提供,旨在使注册过程非常简单。没有很多关于VB.NET和VB的教程。在那里互相交流,但我确实发现this one可能足以让你解开。
还有this link - 它有一个标题为“#34;包装本机应用程序中的托管对象”的部分"。给它一个阅读,因为它基本上就是你正在做的事情。
我说"基本上"因为在这种情况下,您正在构建.NET代码以加载其他一些.NET代码...使用COM。如果您还没有沿着这条路走下去,我建议您完全避免使用COM,只使用.NET引用,完全跳过ProgID和RegAsm的整个业务。这有点像走一条崎岖不平的弯路。您最终会得到一个有效的应用程序,但它将更难维护并且可能更慢。无论如何,值得深思。
如果它帮助您解决问题,请不要忘记投票并接受此答案!谢谢=)