解决 COM 相关错误 0x80040154 的技术?

Dav*_*ave 5 c# com interop com-interop .net-4.0

更新了更多调试信息

我正在运行一个我没有源代码的专有软件包,它有一个基于 COM 的插件接口。我有一个 COM 可见的 .NET 程序集,该应用程序在一台计算机上成功加载,但在另一台计算机上无法加载。

过去两天我一直在研究这个问题,我觉得我在 COM 环境中漫无目的地游荡。在没有加载我的插件的系统上,当我使用 时regasm /codebase /tlb,tlb 生成并成功注册。

当我查看唯一可用的日志文件时,它提到它无法创建对象,并返回错误代码 0x80040154。

我无法弄清楚为什么无法创建对象,希望有人可以提出一些调试策略。这是我已经尝试过的,但没有成功:

  • 将我的 DLL 及其依赖项从工作计算机复制到非工作计算机
  • 在非工作计算机上安装VS2010(工作计算机已安装)
  • 比较我的 DLL 的 Dependency Walker 的结果及其在两台计算机上的依赖项(它们是相同的)
  • 使用 ListDLL。两个系统加载相同的 DLL
  • 运行进程监视器并在运行时过滤程序集的 CLSID regasm /codebase /tlb。除了 PID 和日期戳之外,两个日志都是相同的,即使工作系统创建了 tlb 并成功注册,非工作系统注册了程序集,但没有创建 tlb。
  • 运行进程监视器并在运行应用程序时过滤程序集的 CLSID。工作系统在日志中有几个条目,但非工作系统没有,我相信这是预期的,因为 tlb 没有被创建。
  • 查看工作系统上的 OleView,其中列出了程序集,并在其下方列出了类型库。非工作系统列出了程序集,但没有关联类型库。见下文。

以下是工作和非工作系统上 OleView 中程序集条目之间的差异:

  • 工作系统在我假设对应于生成和注册的类型库的程序集下有一个条目。非工作系统没有。
  • 非工作系统上的 _Object 在 CLSID 下有一个名为 的额外值InprocServer32[InprocServer32] = (gibberish here)
  • 非工作系统上的 IConnectionPointContainer 具有与InprocServer32上述相同的条目
  • IDispatch、IManagedObject 和 IProvideClassInfo 相同

我会查看注册表,也许我需要删除那些额外的条目并再次尝试运行 regasm?

编辑 - 我解决了这个问题。感谢大家的帮助。事实证明,两个系统上都缺少一个文件,但无论出于何种原因,regasm 在一个系统上起作用,而在另一个系统上不起作用。我怀疑可能发生了变化,将依赖项复制到系统路径中的文件夹!所以我做了一个冰雹玛丽,复制了 dll,然后在没有任何消息的情况下执行了 regasm。然后应用程序成功加载了插件!

yms*_*yms 2

这两个系统有不同的CPU架构吗?如果是这种情况,您的 COM 对象可能明确构建为 X86 CPU 而不是 AnyCPU,在这种情况下,您可能还需要将客户端应用程序构建为 X86 以避免 X64 系统中的兼容性问题。