2009-05-01 107 views
4

我一直试图解决这个问题很长一段时间,似乎没有任何工作。如何在.net项目中使用Reg-Free COM作为vb6 dll引用?

我有一个用vb6编写的COM DLL。我在.net中添加对此DLL的引用,并在引用上将'isolated'和'copy local'属性设置为true。显然这应该可以实现免注册。

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

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

回答

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

+0

您是否曾经发现这是否与非ui线程默认创建为MTA vs STA线程有关? – 2009-10-26 02:36:48

2

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

编辑

只是一个想法可能比较简单,只是注册的dll首次应用在新机器上运行。注册免费com interopt只适用于Windows XP和更新版本,所以如果你的目标是任何恐龙,它将无法正常工作。

3

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

2

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

首先得到...您的客户使用 注册服务器;然后取消注册 服务器并验证您的错误 消息是您所期望的;和 终于...工艺和部署清单 文件。这样,您的故障排除 努力...将被限制在您的清单文件的 结构中(并且如果您选择,则 清单中的程序集正确嵌入清单 )。

当故障排除后免注册COM 问题,该事件查看器 Windows Server 2003的上是你的朋友... 看在系统事件日志来自COM服务器的事件。 我不建议你看看 Windows XP事件日志... 它总是会包含一个 消息...这并不帮助 确定问题。

相关问题