【问题标题】:VB6 binary compatibility - adding new EventsVB6 二进制兼容性 - 添加新事件
【发布时间】:2010-12-08 09:26:47
【问题描述】:

在 VB6 ActiveX exe 项目中,是否有任何方法可以在添加新事件时为事件调度接口保留 GUID?

显然更改现有事件会破坏兼容性。添加新的不会导致 VB6 IDE 发出警告。不过,这并不让我感到惊讶,因为它也不会在您添加新方法时发出警告,但至少现有方法会保留其 GUID。

对于事件,如果以后添加新事件,似乎无法保持现有事件的向后兼容性。

对于通过 COM 集成的 VB6 应用程序来说,这似乎不是问题;我假设 VB 运行时做了一些聪明的事情来通过注册表获取事件,而无需预先知道 GUID。

另一个应用程序是 .Net(特别是 C#),我必须手动声明接口以实现事件接收器,我希望 GUID 保持不变以避免重新编码 i/f每当扩展 VB6 应用程序时。我可能既不知道也不关心 VB6 应用程序中新实现的事件 - 我只是希望能够继续使用预先存在的事件而不需要更改 .Net 源代码。

是否有一些我错过的 VB6 技巧可以让我做到这一点?

【问题讨论】:

    标签: com vb6 events binary-compatibility


    【解决方案1】:

    问题是一旦定义了一个 COM 接口是不变的。但是 COM 具有版本控制功能,因此可以将旧接口设置为与新接口兼容。

    Visual BASIC 在幕后所做的是创建一个新版本的 com 界面。更新版本号,添加新方法并设置所需信息,以便新接口可以自动与旧接口一起使用。

    正如它所指出的,事件似乎不是自动完成的。我使用 Visual Studio OLE/COM 对象视图并查看 GUID 更改。

    混合 VB6/.NET 的一种可能的解决方案有点麻烦,但可以让您清楚了解何时进行更改。首先,您需要使用 OLE/COM 对象视图来获取 VB6 对象的 IDL。然后使用 MIDL 编译器生成一个 typelib。从现在开始,使用 typelib 作为您的参考。

    您必须重命名接口,因为它会与 VB6 名称冲突。这个想法是 .NET 和 VB6 都将引用类型库并实现接口。每当您想更新接口时,您都需要更改 IDL,重新编译 typelib 并为两者实现接口。

    现在,如果这听起来有点复杂,然后继续 WFT!?我不怪你。但是在我自己的转换项目中,我发现它在某些情况下很有用,当 VB6 的东西仍在持续开发中但您需要在 .NET 中使用它时

    现在,一个更简单的解决方案可以是识别和分离两个组件互操作所需的最小值。说事件和一些属性。为该接口生成 IDL。编译一个类型库并将其用作参考。我也这样做了。

    【讨论】:

    【解决方案2】:

    我从来没有找到一种方法来防止在添加事件时破坏兼容性。不幸的是,这是我必须在第一时间就做好的事情之一(获取我所有的新事件、参数等),这样当我破坏兼容性时,我只需要经历一次痛苦。

    【讨论】:

      【解决方案3】:

      恐怕我在更改事件时也没有找到保持 GUID 常量的任何方法。但如果您只在 .NET 应用程序中使用 VB6 程序集,您可以每次都 tlbimp VB6 dll您重新创建它,然后创建对它的引用,而不是在 .NET 中手动编写接口?

      【讨论】:

      • 可能,但我真正追求的是一种修改 VB6 应用程序的方法,这并不意味着我们的 .Net 应用程序(以及任何也与旧版 VB6 集成的第三方应用程序)应用程序 - 并且有几个)需要完全触及,除非我们/他们想要实施新事件。
      • 检查 VB6 Service Pack 7 的状态——不会发生。
      猜你喜欢
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 2012-09-24
      • 2020-05-12
      • 2011-08-03
      • 1970-01-01
      相关资源
      最近更新 更多