5

我一直在尝试解决这个问题很长时间,但似乎没有任何效果。

我有一个用 vb6 编写的 COM DLL。我在 .net 中添加了对此 DLL 的引用,并将引用上的“隔离”和“复制本地”属性设置为 true。显然,这应该启用无注册 com。

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

我究竟做错了什么?我已经阅读了大量关于此的零散文章,但没有一篇能给我一个可行的解决方案。我已经修补了视觉工作室,但无济于事。我已经对 make-my-manifest 进行了少量修改,但它不起作用(即使在测试项目中也是如此)。

4

4 回答 4

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

于 2009-05-24T16:29:23.003 回答
3

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

于 2009-05-01T15:54:20.303 回答
2

这是一个描述使用免费注册 com 互操作的链接。如果您已经这样做了,请发布您的清单文件。你可能有错别字。

编辑

只是想在应用程序第一次在新机器上运行时注册 dll 可能更简单。免注册 com interopt 仅适用于 Windows XP 和更新版本,因此如果您的目标是任何恐龙,它将无法正常工作。

于 2009-05-01T15:52:15.190 回答
2

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

首先让...您的客户使用已注册的服务器;然后注销服务器并验证您的错误消息是否符合您的预期;最后......制作和部署清单文件。这样,您的故障排除工作......将仅限于清单文件的结构(以及如果您选择这样做,则正确嵌入程序集清单)。

在解决免注册 COM 问题时,Windows Server 2003 上的事件查看器是您的朋友……在系统事件日志中查找来自 COM 服务器的事件。我不建议您查看 Windows XP 事件日志……它总是包含一条消息……这无助于识别问题。

于 2009-05-01T19:42:55.760 回答