我曾经有一个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”可以加载它而不需要重新编译它。
然后,我用带有
[assembly: ComVisible(true)]
的C#.NET程序集(VS2015)替换了“dllinner”,并重新编译了“dllouter”,一切正常工作。但是,如果我将
[assembly: AssemblyVersion(“1.0.0”)]
更改为新版本,则 Set objCom = New dllinner.Interface
失败。我需要在更新对新“dllinner”的引用之后重新编译“dllouter”才能使其工作。我注意到,将引用Visual Basic“dllinner”和.NET“dllinner”的.vbp文件与GUID后面列出的版本进行比较时,存在差异:
Reference = * \ G {6B0651C5-5225-42A6-841F0322797E5018}# 1.0 #0#...
粗体值针对具有新程序集版本(例如2.0)的.NET程序集进行更新,而针对Visual Basic DLL引用保持不变(无论“dllinner”版本如何始终为1.0)。
因此,我尝试在assemblyinfo.cs中添加属性
[assembly: TypeLibVersion(1,0)]
,这样做会“修复” .vbp中的引用,这意味着粗体值保持为1.0,无论AssemblyVersion是什么。
然而,问题没有解决: “dllouter”仍无法加载“dllinner”。有没有一种方法可以解决这个问题,避免每次“dllinner”版本更改时重新编译“dllouter”?
ComClassAttribute
,该属性显式设置了接口ID(如果要创建,则还需设置CLSID):https://msdn.microsoft.com/zh-cn/library/microsoft.visualbasic.comclassattribute(v=vs.110).aspx - Ben[Guid("C0DC113C-3839-4427-8DA5-35D768AFF3D6")] partial class classInterface : Interface {};
,除了接口ID之外。现在它可以工作了。我想知道你是否想回答这个问题,还是我应该自己回答。 - BillyJoe