Visual Basic COM DLL 在版本升级时不加载 COM .NET 程序集

Visual Basic COM DLL does not load COM .NET assembly at version upgrade

我曾经有一个 Visual Basic (VB6) COM DLL(我们称之为 "dllouter"),它引用了另一个带有接口的 Visual Basic (VB6) COM DLL(我们称之为 "dllinner") "Interface"。 "dllouter" 按以下方式加载 "dllinner":

Public objCom As dllinner.Interface

Set objCom = New dllinner.Interface

当 "dllinner" 版本更改时,"Interface" 没有更改,"dllouter" 能够毫无问题地加载它,无需重新编译。

之后,我将 "dllinner" 替换为带有 [assembly: ComVisible(true)] 的 C# .NET 程序集 (VS2015),然后重新编译 "dllouter" 一切都很好并且可以正常工作。

但是如果我将 [assembly: AssemblyVersion("1.0.0")] 更改为较新的版本,则 Set objCom = New dllinner.Interface 会失败。在更新对新 "dllinner" 的引用后,我需要重新编译 "dllouter" 以使其工作。

我注意到将 .vbp 文件与对 Visual Basic "dllinner" 和 .NET "dllinner" 的引用进行比较,GUID 后列出的版本有所不同:

参考=*\G{6B0651C5-5225-42A6-841F0322797E5018}#1.0#0#...

对于具有新程序集版本(例如 2.0)的 .NET 程序集,粗体值已更新,而对于 Visual Basic DLL 引用(始终为 1.0,无论 "dllinner" 版本是什么),它保持不变).

因此我尝试将 属性 [assembly: TypeLibVersion(1,0)] 添加到 assemblyinfo.cs 并这样做 "fixes" .vbp 中的引用意味着粗体值保持为 1.0无论 AssemblyVersion 是什么。 但是,问题并没有解决:"dllouter"仍然无法加载"dllinner".

有没有办法解决这个问题,避免在任何时候 "dllinner" 版本更改时重新编译 "dllouter"?

如果您希望 COM 可见程序集与以前的版本兼容,您必须:

1) 确保界面中没有可见的变化。如果已部署的接口发生变化,那么您的新对象将不兼容,您将不得不生成新的 CLSID、IID 和新的类型库。

2) 确保每个可见的 class 都使用与以前版本相同的 IID 进行注释。如果你忘记在以前的版本上这样做,编译器会为你生成一个,所以你需要找出它是什么,以便新版本可以相同。您可以使用 TlbView 或注册表来查找。

3) 确保每个可创建的 class 都使用与以前版本相同的 CLSID 进行注释。

检查类型库是否相同也是个好主意。您可以使用 TlbView 或类似工具反编译以前版本的类型库,然后对新版本执行相同的操作。您应该看不到任何重要和不同之处。

注意:如果你想增加额外的功能,你可以这样做,但你需要为新界面创建一个新的IID,它应该继承旧界面(应该用旧IID标记)。