VB6二进制兼容性 - 添加新事件

时间:2009-10-20 15:04:39

标签: com vb6 events binary-compatibility

在VB6 ActiveX exe项目中,如果添加新事件,有没有办法保留事件调度接口的GUID?

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

混合VB6 / .NET的一个可能的解决方案有点痛苦但是在做出更改时保持一切清晰。首先,您需要使用OLE / COM对象视图来获取VB6对象的IDL。然后使用MIDL编译器生成类型库。从现在开始,使用typelib作为参考。

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

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

现在,简化解决方案可以识别和分离两个组件互操作所需的最低要求。说事件和一些适当的。生成该接口的IDL。编译一个类型库并将其用作参考。我也是这样做的。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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