【问题标题】:x86 COM interop from x64 .Net assembly using COM+ - "No such interface supported" error使用 COM+ 从 x64 .Net 程序集进行 x86 COM 互操作 - “不支持此类接口”错误
【发布时间】: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+


【解决方案1】:

这是一个相当老的问题,但在与这个问题斗争了一段时间后,我刚刚在我们的环境中解决了这个问题。我对 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 是我在错误中报告的那个;

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

【讨论】:

  • 所以您重新构建了项目并解决了您的问题?您的回答很好地表明您遇到了同样的问题,但解决方案不是很清楚。
  • 这更多的是编译时间的运行时问题。我们在运行时使用的生成的 Interop 类被简单地替换为重新生成的类。使用新生成的 Interop 类重新启动程序后,它又开始工作了。这就是我所说的“利用它为我们解决了这个问题”的意思。这个问题突然出现的原因是将代码移动到新服务器。我认为在搬家过程中有些事情搞混了。
猜你喜欢
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 2011-04-11
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多