2

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

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

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

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

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

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

4

3 回答 3

2

问题是一旦定义了一个 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。编译一个类型库并将其用作参考。我也这样做了。

于 2009-10-20T19:40:36.127 回答
0

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

于 2009-10-20T16:15:42.587 回答
0

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

于 2009-10-20T15:44:22.243 回答