【问题标题】:Problems connecting x64 application through COM objects通过 COM 对象连接 x64 应用程序的问题
【发布时间】:2020-03-19 05:42:18
【问题描述】:

我们有一个在 Win32 平台中构建的 C++ 程序“A”,它与在任何 CPU 平台中构建的 C# 应用程序“B”连接。 B 应用程序通过一些 COM 对象访问 A,并且“A”程序创建了我从 B 引用的 .tlb 文件。使用 Win32 和 Any CPU 平台,我在使这两个程序连接和工作方面没有问题。

最近“A”程序已更新为在 64x 下工作,并且不再为它构建 Win32 版本。现在,每当我尝试从项目“B”中引用新的 .tlb 文件时,我都会收到错误提示

“无法添加对 ...tlb 的引用。请确保 文件是可访问的,并且它是一个有效的程序集或 COM 组件”

我尝试使用 x86 和 x64 构建“B”项目,但没有任何效果。

我是 COM 对象的新手,所以我对这个主题的了解非常有限。我在 VS 2017 工作。任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 所以基本上你是说你不能从 C# 项目中引用 .tlb 文件?该 .tlb 文件是如何构建的?还要确保您的 A 对象已在 64 位注册表中注册(通过您使用的任何方式)

标签: c# c++ visual-studio x86 com


【解决方案1】:

您的描述让我觉得,A 充当 InProc COM 服务器,这意味着架构(x86 或 x64)确实很重要。所以如果你在改变A的架构后遇到麻烦,我建议你尝试对Runtime Callable Wrapper的创建进行更多的控制,它是由A 的.tlb 文件。

TLB-Importer 工具请参考https://docs.microsoft.com/en-us/dotnet/framework/tools/tlbimp-exe-type-library-importer。使用它创建 Runtime Callable Wrapper(又名interop.*.dll)并确保添加开关/machine:x64。例如。在具有提升的用户权限的终端窗口中运行类似以下的命令以获取 .NET 程序集,该程序集可以由 x64 .NET 程序加载: tlbimp A.tlb /machine:x64

如果A.tlb 已正确注册并且您在 x64 平台上运行(所以 Any CPU 确实意味着 x64B 应该b 能够加载 RCW 并从注册表中引用类型信息。如果这仍然造成一些麻烦,您应该考虑使用https://docs.microsoft.com/en-us/windows/win32/com/ole-com-object-viewer 仔细查看注册类型。

【讨论】:

    猜你喜欢
    • 2012-01-01
    • 2011-06-09
    • 2011-07-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 2017-09-10
    相关资源
    最近更新 更多