c# - 每次制作 dll 时如何告诉 vb6 不要创建新版本的 interfaces/com 对象?

标签 c# .net vb6 binary-compatibility

我有 .NET 代码使用的 vb6 com 服务器(ActiveX DLL 项目)

每次我对 vb6 代码进行更改并生成 dll 时,我也必须重新编译我的 .NET 客户端代码,因为看起来 VB6 会为接口(interface)和 com 对象生成新的 GUID 或版本。

我承认这是一个很好的做法,因为进行了更改,但我想禁用此行为,让我的 .NET 客户端代码在每次更新我的 vb6 dll 时都相同。

无论对 COM 对象或 COM 接口(interface)做了什么更改,我如何告诉 VB6 保持 ActiveX dll 的所有 GUID 和版本相同?

最佳答案

项目 + 属性、组件选项卡中的选择很重要。您必须在此处选择“二进制兼容性”以强制它重新使用旧的 guid。并保留 DLL 的副本作为提供 guid 的“主控”,将其 checkin 源代码管理。

当您添加新类时,您还必须更新该副本,以便将来的版本知道为那些添加的类重用相同的 guid。很容易忘记,当你忘记时很难诊断。

这是非常危险的,重用 guids 是一个非常强大的 DLL hell 诱因。只要小心避免更改现有方法,就可以让旧的客户端程序继续使用新的 DLL。不仅是它们的方法签名,还有它们的实现。遇到旧版本 DLL 的更新客户端将以非常令人讨厌的方式失败,访问冲突崩溃几乎无法诊断。

关于c# - 每次制作 dll 时如何告诉 vb6 不要创建新版本的 interfaces/com 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24121240/

相关文章:

c# - Linq 查询查找嵌套列表包含序列的匹配项

c# - 使用新关键字

.net - SortedList 与 SortedDictionary 与 Sort()

c# - WinForms 中单选按钮列表的第三方控件?

c# - Linq 和 SQL 之间的不同结果

vb6 - Visual Basic 6 字节码规范

c# - Entity Framework 6.0.1 不必要地转换 smallint

VB6 将 varCode 变暗为字符串 * 2

string - VB6 中的字体居中

c# - Azure Devops 上的 Nuget 还原失败,消息为 "unable to load the service index for source"