2012-08-13 122 views
1

我被一个VB6程序员提供了一个需求(是的,他们仍然存在)。有一个vb6应用程序使用vb6 dll,这个dll现在使用一个.net dll,它使用另一个.net dll。现在我的要求是.net dll应该像vb dll一样工作,即一旦注册了vb6 dll,它可以被其他应用程序使用,并且在推出时不需要包含它(所以我被告知)。有没有办法将我的.net dll放到其他vb6应用程序可以使用它。从我看到的这只有在我的.net dll与我的vb6 exe文件位于同一个文件夹时才有效。如何集中一个VB6引用的.net dll(com interop)dll

我已阅读本How Does a COM Program Locate a .NET DLL Registered for COM Interop?

谢谢

回答

4

COM是其DLL地狱问题相当臭名昭著。机器上所有程序的注册是全球性的。因此,替换DLL通常最终会破坏使用COM服务器的其他程序。

.NET有一个对策,当您运行Regasm.exe注册[ComVisible] .NET程序集时,默认情况下会将程序集放到GAC中。它会自动购买DLL地狱保护。然而,这并不罕见,特别是在您的开发机器上,也是由IDE完成的,用/ codebase选项注册程序集。

但是现在你会遇到一个新问题,CLR没有很好的机制来定位相关的.NET程序集。探测路径基于EXE,COM客户端。这就是为什么将您的相关程序集复制到EXE安装目录中的原因。

这对测试很好,但不是您在部署服务器时想要使用的良好通用解决方案。您无法准确预测EXE将使用COM服务器以及它所在的位置。搞乱其他人拥有的程序的安装目录往往在政治上很困难。

使用GAC,解决所有问题。

+0

我喜欢短语“政治上困难”。有趣的是,在大公司的编程中有很多政治因素。这是糟糕的经理人的结果。 – David 2012-08-14 09:18:49