【发布时间】:2012-03-22 04:33:58
【问题描述】:
我正在编写一个从 x64 进程 (SS Reporting Services) 调用的 C# 程序集,并且需要使用 x86 3rd 方 COM 程序集。
当我将我的程序集编译为 x64 时,只要对 COM 程序集进行第一次调用,就会收到“类未注册”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”。
如果我在注册表中搜索错误消息中的接口 GUID 或“IBaseObjects”,则找不到匹配项。自从创建 COM+ 应用程序以来,我在 x86 模式下遇到了同样的错误(我想这是有道理的),尽管在此之前它在 x86 中运行良好。
所以,我假设我尝试使用的“TRIMSDK.IBaseObjects”接口没有被注册为 COM+ 东西,我不知道为什么或如何修复它。
有什么想法吗?提前致谢。
更新:我想我得到了 TRIMSDK.IBaseObjects 的 E_NOINTERFACE 异常,因为接口上的 TypeLibType 属性仅设置为“FNonExtensible”,而我在程序集中成功使用的其他接口也有'FDispatchable'。是否有可能绕过此错误(更改类型库或以某种方式手动注册“IBaseObjects”接口)?
【问题讨论】:
-
感谢您提供的链接,但我没有发现任何特别有用的东西。我应该寻找什么?
-
如果您无法关注该文章,您可以尝试通过1code.codeplex.com/wikipage?title=COM 索取样品。很有可能是你注册的COM对象不正确。
-
自您的初始评论以来,我已经稍微更新了我的问题。我知道 COM 注册有问题,但修复它是另一回事(特别是因为我没有源来重新编译具有不同类型属性的 COM 程序集):)。我最终使用了昨天找到的 CSExeCOMServer 示例来制作 C# 包装器来解决我的问题。感谢您的链接。
-
您可以描述这些步骤并将其用作此问题的答案。如果他们遇到同样的问题,这可以帮助其他人。问候,
标签: c# com-interop com+