gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:30:03 25 4
gpt4 key购买 nike

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

Public objCom As dllinner.Interface

Set objCom = New dllinner.Interface

当“dllinner”版本改变时,“Interface”没有改变,“dllouter”能够毫无问题地加载它,不需要重新编译它。

之后,我用 C# .NET 程序集 (VS2015) 和 [assembly: ComVisible(true)] 替换了“dllinner”,并重新编译了“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 中的引用,这意味着保留粗体值到 1.0,无论 AssemblyVersion 是什么。但是,问题并没有解决:“dllouter”仍然加载“dllinner”失败。

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

最佳答案

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

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

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

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

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

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

关于c# - Visual Basic COM DLL 在版本升级时不加载 COM .NET 程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50463222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com