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

Com VB6二进制兼容性-添加新事件,com,vb6,events,binary-compatibility,Com,Vb6,Events,Binary Compatibility,在VB6 ActiveX exe项目中,是否有任何方法可以在添加新事件时保留events dispinterface的GUID 显然,更改现有事件会破坏兼容性。添加新的不会导致VB6 IDE发出警告。不过,这并不让我感到惊讶,因为当您添加新方法时,它也不会发出警告,但至少现有方法保留了它们的guid 对于事件,如果以后添加新的事件,似乎无法保持现有事件的向后兼容性 对于通过COM集成的VB6应用程序来说,这似乎不是一个问题;我假设VB运行时做了一些聪明的事情,通过注册表获取事件,而不需要事先知道

在VB6 ActiveX exe项目中,是否有任何方法可以在添加新事件时保留events dispinterface的GUID

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

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

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

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


是否有一些VB6技巧让我无法做到这一点?

我从未找到一种方法来防止添加事件时出现兼容性中断。不幸的是,这是我第一次必须纠正的事情之一(获取所有新事件、参数等),因此当我破坏兼容性时,我只需经历一次痛苦。

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

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

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

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

混合VB6/.NET的一个可能的解决方案有点麻烦,但它可以让您清楚地知道何时进行更改。首先,需要使用OLE/COM对象视图获取VB6对象的IDL。然后使用MIDL编译器生成一个类型库。从现在起,使用typelib作为您的引用

您必须重命名接口,因为它将与VB6名称冲突。其思想是.NET和VB6都将引用typelib并实现接口。只要您想更新接口,就要更改IDL,重新编译typelib并为两者实现接口

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


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

可能吧,但我真正想要的是修改VB6应用程序的方法,这并不意味着我们的.Net应用程序(以及任何也与旧版VB6应用程序集成的第三方应用程序-有几种)除非我们/他们想要实现新的事件,否则根本不需要触摸。检查VB6 Service Pack 7上的状态——不会发生。这是一个非常有趣的解决方案!这种方法不会因为不能以这种方式实现事件而失败吗?