如何在.net项目中使用Reg-Free COM进行vb6 dll引用?

时间:2009-05-01 15:34:21

标签: .net com vb6 regfreecom

我一直试图解决这个问题很长一段时间,似乎没什么用。

我有一个用vb6编写的COM DLL。我在.net中添加了对此DLL的引用,并在引用上将'isolated'和'copy local'属性设置为true。显然这应该是启用reg-free com。

但它不起作用。如果我尝试使用另一台计算机,或使用regsvr32取消注册DLL,尝试访问DLL会引发异常(实际上是说所需的com类不存在)。 DLL和清单文件与EXE位于同一个文件夹中,但显然完全忽略了它们。

我做错了什么?我已经阅读了大量关于此的散文,但没有一篇能给我一个有效的解决方案。我用视觉工作室修补无济于事。我用make-my-manifest修改了一小部分,但它没有用(甚至在测试项目中)。

4 个答案:

答案 0 :(得分:4)

我在非ui线程上创建和使用com类。显然,vb6 DLL上的Reg-Free com在这种情况下不起作用。此测试代码显示:

Private Sub RunTest() Handles Button1.Click
    Try
        Dim x As New RegTestProject.RegTestCall
        MsgBox(x.RegTestFunction())
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

Private Sub RunThreadedTest() Handles Button2.Click
    'fails if reg-free COM is used'
    Dim t As New Threading.Thread(AddressOf RunTest)
    t.Start()
End Sub

当我使用正常注册的DLL运行时,两个测试都成功。如果我使用reg-free com,即使正常测试仍然成功,线程测试也会失败。看起来这对于解决方案来说将是一个巨大的痛苦。

答案 1 :(得分:3)

我很确定当您以这种方式引用COM组件时,每次构建时都会发生COM组件导入。这意味着必须在构建项目的每台机器上以传统方式注册COM组件。

答案 2 :(得分:2)

这是一个link,它描述了使用免费注册com互操作。如果您已经这样做,请发布您的清单文件。你可能错过了一个拼写错误。

修改

只是在第一次在新机器上运行应用程序时注册dll可能会更简单。免费注册com interopt仅适用于Windows XP及更高版本,因此,如果您将恐龙定位在那里,它将无效。

答案 3 :(得分:2)

以下是MSDN Troubleshootingarticle部分关于无注册COM的摘录。如果您已经看过它,请道歉。好消息是,您已经完成了这些步骤。它建议在Windows Server 2003中重现问题(可能使用Virtual PC?),然后事件日志应该有所帮助。

  

首先得到......您的客户正在与之合作   注册服务器;然后取消注册   服务器并验证您的错误   消息是你所期望的;和   最后......制作和部署清单   文件。这样你的故障排除   努力......将局限于   清单文件的结构(和   正确嵌入装配体   如果您选择这样做,则表明。)

     

免费注册时排除故障   COM问题,事件查看器   Windows Server 2003 是你的朋友......   在系统事件日志中查找来自COM服务器的事件。   我不建议你看看   Windows XP事件日志...   它总会包含一个   消息......这没有用   找出问题所在。