【问题标题】:Visual Basic COM DLL does not load COM .NET assembly at version upgradeVisual Basic COM DLL 在版本升级时不加载 COM .NET 程序集
【发布时间】: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 {};。现在它起作用了。我想知道你是想回答这个问题还是我应该自己回答。

标签: c# .net com vb6 typelib


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2012-06-30
    • 2012-08-05
    • 2011-07-27
    相关资源
    最近更新 更多