使用DLL中的类创建VB6应用程序,然后在编译后替换该DLL?

7
我的问题相对简单,我能否创建引用dll中类的VB6应用程序,然后在运行时替换那个dll?
现在我的初步猜测是……在VB6中没有机会。
所以我的想法转向了VB.net互操作性dll。我能在这里这样做,然后从VB中调用interop dll吗?
同样,我的猜测是不能……但如果有人知道不同的话,我会很高兴的。
我认为唯一能实际起作用的是.Net中的DI,但我只限于.Net 2或3.5版本,所以我不知道是否可能。
所以背景是……
我们有一个特定站点使用的dll,但我们不想将它分发给所有人。相反,我们想建立一个克隆dll,只需设置接口就可以完成VB6构建。 当它到达需要它的站点时,他们想要替换虚拟dll,并代之以他们自己的版本。
注意:当安装时我们使用RegFreeCOM,因此如果需要,我可以玩弄清单文件。
如有任何想法,将不胜感激。
尼克

1
你能否在VB6中使用后期绑定而不是对dll进行硬引用? - Tim Lentine
2
你可以在大约10分钟内测试这个。创建一个dll项目,放置一个带有一个返回字符串的方法的类,编写代码以返回“abc”。编写一个测试工具,添加一个引用,调用该方法并显示它。现在在一个新项目中编写另一个dll。相同的类名,相同的方法名,返回“def”。将dll复制到测试工具文件夹中的第一个dll上,并运行测试工具。我认为你会看到新的字符串,但是测试才能证明。如果我在这台机器上有VB6,我可能会比输入注释更快地完成它。 - Kate Gregory
1
这是将代码放在 DLL 中而不是应用程序中的基本原因之一(另一个原因是代码重用/共享)。 - Matt Wilko
谢谢Kate。我已经测试过了,它确实像你说的那样运行。我原本预料会出现DLL地狱问题,但令人惊喜的是并没有发生。 - Nick
2个回答

9

这是一个 COM 动态链接库,因此它没有静态地链接到 VB6 exe 上,只要两个 DLL 的类型库中的 clsid 和接口 id 相同,你可以根据需要进行交换。(如果这是一个 VB6 dll,那么使用“二进制兼容性”构建选项轻而易举地实现)


谢谢Alex。我的一个困惑是如何强制CLSID和TLBID相同,而二进制兼容性为我解决了这个问题。 - Nick

0

你也可以使用后期绑定,而不是直接在 VB6 代码中进行引用。你可以创建一个对象,然后将该对象设置为实例。

示例和信息:

MVPS

Microsoft


这其实并不是必要的,因为问题的前提是错误的。他假设不能替换新的DLL,而事实上是可以的。 - StayOnTarget
@DaveInCaz 我建议这样做的原因是问题中没有保证二进制兼容性是可能的。你和被接受的答案都是正确的,如果DLL是二进制兼容的,那么你不需要延迟绑定。如果由于某些原因DLL不兼容,则延迟绑定将是更好的选择。 - UnhandledExcepSean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接