【发布时间】:2018-05-22 08:34:01
【问题描述】:
我曾经有一个 Visual Basic (VB6) COM DLL(我们称之为“dllouter”),它引用了另一个带有接口“Interface”的 Visual Basic (VB6) COM DLL(我们称之为“dllinner”)。 “dllouter”通过以下方式加载“dllinner”:
Public objCom As dllinner.Interface
Set objCom = New dllinner.Interface
当“dllinner”版本发生变化时,“接口”没有变化,“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 并这样做“修复” .vbp 中的引用,这意味着无论 AssemblyVersion 是什么,粗体值都保持为 1.0。
然而问题并没有解决:“dllouter”仍然无法加载“dllinner”。
有没有办法解决这个问题,避免在任何“dllinner”版本更改时重新编译“dllouter”?
【问题讨论】:
-
如果您更改 dllinner 的公共接口,这是不可能的。如果你不这样做,那应该是可能的。
-
您是否设置了 CLSID 和接口 ID?
-
即每个类都必须有一个
ComClassAttribute,它显式设置接口 ID(如果要创建,则为 CLSID):msdn.microsoft.com/en-us/library/… -
如果不设置,编译器会自动生成,每个版本都不一样。为了兼容,您需要将它们设置为与以前版本相同的值。
-
@Ben 除了接口 ID 之外,我也错过了类前面的显式 ID
[Guid("C0DC113C-3839-4427-8DA5-35D768AFF3D6")] partial class classInterface : Interface {};。现在它起作用了。我想知道你是想回答这个问题还是我应该自己回答。