.net CLSID的正常情况保持不变,但新版本OCX的IID发生变化?

.net CLSID的正常情况保持不变,但新版本OCX的IID发生变化?,.net,com,vb6,com-interop,ocx,.net,Com,Vb6,Com Interop,Ocx,我正在开发一个C#.NET应用程序,它使用外部开发的(我相信VB6)ActiveX控制器,我使用Aximp.exe从OCX文件导入该控制器。每次获得新版本的OCX时,我都必须重新运行Aximp.exe,否则会出现InvalidCastException,并显示以下消息: 此操作失败,因为COM上的QueryInterface调用失败 与IID接口的组件 由于以下原因,{X13535F4-2X96-4F87-80E6-X342AD8X3E7F}失败 错误:不支持此类接口(HRESULT的异常:0x

我正在开发一个C#.NET应用程序,它使用外部开发的(我相信VB6)ActiveX控制器,我使用Aximp.exe从OCX文件导入该控制器。每次获得新版本的OCX时,我都必须重新运行Aximp.exe,否则会出现
InvalidCastException
,并显示以下消息:

此操作失败,因为COM上的QueryInterface调用失败 与IID接口的组件 由于以下原因,{X13535F4-2X96-4F87-80E6-X342AD8X3E7F}失败 错误:不支持此类接口(HRESULT的异常:0x80004002 (电子接口)

当比较Oleview.exe中不同版本OCX的TypeLib输出时,唯一更改的是IID:s和版本号。CLSID保持不变

IID:s发生更改但CLSID:s在不同版本之间保持不变,这正常吗

这个IID:s是否表示OCX不是在启用“二进制兼容性”的情况下构建的(如果它确实是用VB6制作的)


在不重新运行Axim.exe重建应用程序的情况下,我是否应该采取措施来保持与OCX新版本的兼容性?

我认为这是VB6版本兼容性设置为“项目兼容性”时的行为。如果是“不兼容”,那么clsid也会在每次编译时更改。您需要让外部开发人员使用二进制兼容性,或者需要在每个版本上重新导入(重新读取)新的接口定义。可能是因为如果接口在新版本中被更改(更改现有的方法、属性、事件),那么二进制兼容性是不可能的-可以添加新的方法、属性和事件,并保持二进制兼容性。@MarkL-您应该发布一个答案。“二进制兼容性”是保持guid稳定的方法。注:VB默认情况下不会这样做,因为由于接口发生了变化(方法布局、方法签名),因此该接口应该是一个全新的接口。如果您选择“二进制兼容性”,您可能会遇到崩溃,因为接口确实会发生显著变化。。。这是一项设计/工程choice@SimonMourier-我曾考虑将此作为一个答案发布,但由于OP似乎不确定他们的外部开发人员发生了什么事情,我暂且不发表意见。关于二进制兼容性,您是正确的,当您转到“重新编译”并且设置了二进制兼容性,但对接口进行了更改(至少对引用的兼容目标进行了更改)时,vb6将显示一条警告。根据用户对令人困惑的警告屏幕的反应和选择,消费客户端可能工作,也可能不工作,了解COM兼容性是必须的。我相信这是VB6版本兼容性设置为“项目兼容性”时的行为。如果是“不兼容”,那么clsid也会在每次编译时更改。您需要让外部开发人员使用二进制兼容性,或者需要在每个版本上重新导入(重新读取)新的接口定义。可能是因为如果接口在新版本中被更改(更改现有的方法、属性、事件),那么二进制兼容性是不可能的-可以添加新的方法、属性和事件,并保持二进制兼容性。@MarkL-您应该发布一个答案。“二进制兼容性”是保持guid稳定的方法。注:VB默认情况下不会这样做,因为由于接口发生了变化(方法布局、方法签名),因此该接口应该是一个全新的接口。如果您选择“二进制兼容性”,您可能会遇到崩溃,因为接口确实会发生显著变化。。。这是一项设计/工程choice@SimonMourier-我曾考虑将此作为一个答案发布,但由于OP似乎不确定他们的外部开发人员发生了什么事情,我暂且不发表意见。关于二进制兼容性,您是正确的,当您转到“重新编译”并且设置了二进制兼容性,但对接口进行了更改(至少对引用的兼容目标进行了更改)时,vb6将显示一条警告。根据用户对令人困惑的警告屏幕的反应和选择,消费客户端可能工作,也可能不工作,因此必须了解COM兼容性。