在VB6 ActiveX exe项目中,如果添加新事件,有没有办法保留事件调度接口的GUID?
显然,更改现有事件会破坏兼容性。添加新的不会导致VB6 IDE发出警告。但是,这并不让我感到惊讶,因为它在添加新方法时也不会发出警告,但至少现有方法会保留其GUID。
对于事件,如果以后添加新事件,似乎无法保留现有事件的向后兼容性。
对于通过COM集成的VB6应用程序来说,这似乎不是问题;我假设VB运行时通过注册表做一些聪明的事情来获取事件而无需事先了解GUID。
其他应用程序是.Net(特别是C#)并且我必须手动声明接口以实现事件接收器,我希望GUID保持不变以避免重新编码i / f每当VB6应用程序扩展时。我可能既不知道也不关心VB6应用程序中新实现的事件 - 我只是希望能够继续使用预先存在的事件而无需更改.Net源代码。
是否有一些我错过的VB6技巧可以让我这样做?
答案 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中编写接口?