首页 文章

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

提问于
浏览
4

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

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

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

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

4 回答

  • 2

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

  • 4

    这是一个描述使用免费注册com interop的link . 如果您已经这样做,请发布您的清单文件 . 你可能错过了一个错字 .

    Edit

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

  • 2

    我在非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,即使正常测试仍然成功,线程测试也会失败 . 看起来这对于解决方案来说将是一个巨大的痛苦 .

  • 3

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

    首先得到......您的客户使用注册服务器;然后取消注册服务器并验证您的错误消息是您所期望的;最后......制作和部署清单文件 . 这样,您的故障排除工作将仅限于清单文件的结构(如果您选择这样做,则正确嵌入程序集清单) . 在解决无注册COM问题时,Windows Server 2003上的事件查看器是您的朋友...在系统事件日志中查找来自COM服务器的事件 . 我不建议您查看Windows XP事件日志...它总是包含一条消息...这无助于识别问题 .

相关问题