我已经试图解决这个问题很长一段时间了,但似乎什么都没有奏效。
我有一个用vb6写的COM动态链接库。我在.net中添加了对此DLL的引用,并在引用上将“isolated”和“copy local”属性设置为true。显然,这是为了启用reg-free com。
但它不起作用。如果我在另一台计算机上尝试,或者用regsvr32注销该动态链接库,则尝试访问该动态链接库时会抛出一个异常(实际上是说所需的com类不存在)。DLL和清单文件与EXE在同一文件夹中,但它显然完全忽略了它们。
我做错了什么?我已经阅读了大量关于这方面的零星文章,但没有一篇给我一个有效的解决方案。我对visual studio进行了一些修补,但都没有效果。我对make-my-manifest进行了少量修改,但它不起作用(甚至在测试项目中也不起作用)。
发布于 2009-05-24 16:29:23
我在非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,即使正常测试仍然成功,线程测试也会失败。看起来这将是一个巨大的工作痛苦。
发布于 2009-05-01 15:54:20
我非常确定,当您以这种方式引用COM组件时,每次生成时都会发生COM组件导入。这意味着COM组件必须以传统的方式在将在其上构建项目的每台计算机上注册。
发布于 2009-05-01 15:52:15
这是一个描述使用免注册com互操作的link。如果你已经这样做了,请张贴你的清单文件。你可能有一个打字错误你失踪了。
编辑
只是想一想,在应用程序第一次在新机器上运行时注册dll可能会更简单。免费注册的com interopt只在Windows XP和更高版本上可用,所以如果你的目标是外面的任何恐龙,它都不会起作用。
https://stackoverflow.com/questions/811894
复制相似问题