我正在编写一个从x64进程(SS Reporting Services)调用的C#程序集,需要使用x86第三方COM程序集。
当我将程序集编译为x64时,一旦第一次调用COM程序集,我就会得到“Class not registered”COM异常。
遵循建议here(对不起,如果我的术语不正确)我创建了一个新的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'。
如果我从错误消息或“IBaseObjects”中搜索注册表中的接口GUID,则找不到匹配项。自从创建COM +应用程序以来,我在x86模式下得到了同样的错误(我觉得这很有意义),尽管在此之前它在x86中运行良好。
所以,我假设我试图使用的'TRIMSDK.IBaseObjects'接口没有被注册为COM + thingy,我不知道为什么或如何修复它。
有什么想法吗?提前谢谢。
更新:我认为我收到了TRIMSDK.IBaseObjects的E_NOINTERFACE异常,因为接口上的TypeLibType属性只设置为'FNonExtensible',而我在程序集中成功使用的其他接口也有'FDispatchable'。是否有可能绕过这个错误(改变类型库或以某种方式手动注册'IBaseObjects'接口)?
答案 0 :(得分:0)
这是一个相当古老的问题,但是我已经在这个问题上挣扎了一段时间之后才在我们的环境中对此进行了整理。我对COM和/或Interop的经验很少,所以如果我的术语有点偏离,请原谅。
我收到的错误消息是
无法将“TYSTransfer.TransferClass”类型的COM对象强制转换为 接口类型'TYSTransfer._Transfer'。此操作失败,因为 用于接口的COM组件的QueryInterface调用 IID'{ E825C39B-1EF3-4319-89FC-AEF62C8117B9 }'由于 以下错误:不支持此类接口(来自HRESULT的异常: 0x80004002(E_NOINTERFACE))。
我也在努力寻找消息中指定的接口GUID。我在组件服务中查找了分配给COM组件的GUID,可以看到;
然后,当我使用DotPeek查看我用来访问此COM组件的生成的Interop类时,我注意到同一接口的关联GUID是我错误中报告的那个; < / p>
所以DotPeek告诉我被引用的Guid来自我的Interop类。事实证明,对目标COM对象重新生成Interop类会生成一个具有正确Guids的类(至少它们是匹配的,所以我认为它们是正确的),并利用它来解决我们的问题。