C# 使用COM+;-&引用;不支持此类接口”;错误

C# 使用COM+;-&引用;不支持此类接口”;错误,c#,com-interop,com+,C#,Com Interop,Com+,我正在编写一个C#程序集,它是从x64进程(SS Reporting Services)调用的,需要使用x86第三方COM程序集 当我将程序集编译为x64时,一旦对COM程序集进行了第一次调用,就会出现“未注册的类”COM异常 按照建议(如果我的术语不正确,很抱歉),我创建了一个新的COM+应用程序,并添加了在我引用的COM程序集中找到的组件。当我以x64运行程序集时,它会成功调用COM程序集,直到出现以下错误: 无法将“TRIMSDK.RecordTypesClass”类型的COM对象强制转换

我正在编写一个C#程序集,它是从x64进程(SS Reporting Services)调用的,需要使用x86第三方COM程序集

当我将程序集编译为x64时,一旦对COM程序集进行了第一次调用,就会出现“未注册的类”COM异常

按照建议(如果我的术语不正确,很抱歉),我创建了一个新的COM+应用程序,并添加了在我引用的COM程序集中找到的组件。当我以x64运行程序集时,它会成功调用COM程序集,直到出现以下错误:

无法将“TRIMSDK.RecordTypesClass”类型的COM对象强制转换为接口类型“TRIMSDK.IBaseObjects”。此操作失败,因为对具有IID“{8A354545-6BCB-11D3-B273-00A0C9FC3DC0}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT的异常:0x80004002(E_NOINTERFACE))

“TRIMSDK.RecordTypesClass”确实根据类定义实现了“TRIMSDK.IBaseObjects”

如果我在注册表中搜索错误消息中的接口GUID或“IBaseObjects”,则找不到匹配项。自从创建COM+应用程序以来,我在x86模式下遇到了相同的错误(我想这是有道理的),尽管在此之前它在x86模式下运行良好

因此,我假设我尝试使用的“TRIMSDK.IBaseObjects”接口没有注册为COM+东西,我不知道为什么或如何修复它

有什么想法吗?提前谢谢


更新:我想我得到了TRIMSDK.IBaseObjects的E_NOINTERFACE异常,因为接口上的TypeLibType属性仅设置为“fNoExtensible”,而我在程序集中成功使用的其他接口也有“FDispatchable”。是否有可能绕过此错误(更改类型库或以某种方式手动注册“IBaseObjects”接口)?

这是一个相当老的问题,但在与此问题斗争了一段时间后,我刚刚在我们的环境中解决了这个问题。我在COM和/或互操作方面的经验很少,所以如果我的术语有点不合适,请原谅

我收到的错误消息是

无法将类型为“TYSTransfer.TransferClass”的COM对象强制转换为 接口类型“TYSTransfer.\u传输”。此操作失败,因为 与的接口的COM组件上的QueryInterface调用 IID“{E825C39B-1EF3-4399-89FC-AEF62C8117B9}”由于以下原因失败: 以下错误:不支持此类接口(HRESULT的异常: 0x80004002(E_NOINTERFACE))

我还很难找到消息中指定的接口GUID。我在组件服务中查找分配给COM组件的GUID,可以看到

然后,当我查看用于访问此COM组件的生成的互操作类时,我注意到同一接口的关联GUID与我的错误中报告的GUID相同


所以DotPeek向我展示了被引用的Guid来自我的互操作类。事实证明,针对目标COM对象重新生成Interop类会生成一个具有正确GUID的类(至少它们匹配,所以我认为它们是正确的),利用这一点,我们解决了这个问题

这是一个很老的问题,但在与这个问题斗争了一段时间之后,我刚刚在我们的环境中解决了这个问题。我在COM和/或互操作方面的经验很少,所以如果我的术语有点不合适,请原谅

我收到的错误消息是

无法将类型为“TYSTransfer.TransferClass”的COM对象强制转换为 接口类型“TYSTransfer.\u传输”。此操作失败,因为 与的接口的COM组件上的QueryInterface调用 IID“{E825C39B-1EF3-4399-89FC-AEF62C8117B9}”由于以下原因失败: 以下错误:不支持此类接口(HRESULT的异常: 0x80004002(E_NOINTERFACE))

我还很难找到消息中指定的接口GUID。我在组件服务中查找分配给COM组件的GUID,可以看到

然后,当我查看用于访问此COM组件的生成的互操作类时,我注意到同一接口的关联GUID与我的错误中报告的GUID相同


所以DotPeek向我展示了被引用的Guid来自我的互操作类。事实证明,针对目标COM对象重新生成Interop类会生成一个具有正确GUID的类(至少它们匹配,所以我认为它们是正确的),利用这一点,我们解决了这个问题

谢谢你的链接,但是我没有发现任何特别有用的东西。我应该寻找什么呢?如果你看不懂那篇文章,你可以试着通过。很可能您对COM对象的注册不正确。自从您最初的评论之后,我已经更新了我的问题。我知道COM注册有问题,但修复它是另一回事(特别是因为我没有使用不同类型属性重新编译COM程序集的源代码):)。最后,我使用昨天发现的CSExeCOMServer示例制作了一个C#包装器来解决我的问题。谢谢你的链接。你可以描述这些步骤,并以此作为这个问题的答案。如果其他人遇到同样的问题,这可以帮助他们。您好,谢谢您的链接,但是我没有发现任何特别有用的东西。我应该寻找什么呢?如果你看不懂那篇文章,你可以试着通过。很可能您对COM对象的注册不正确。自从您最初的评论之后,我已经更新了我的问题。我知道COM注册有问题,但修复它是另一回事(尤其是