我们有一个在 Win32 平台中构建的 C++ 程序“A”,它与在任何 CPU 平台中构建的 C# 应用程序“B”相连。 B 应用程序通过一些 COM 对象访问 A,并且“A”程序创建我从 B 引用的 .tlb 文件。使用 Win32 和任何 CPU 平台,我可以毫无问题地使两个程序连接和工作。
最近“A”程序已更新为可在 64x 中运行,并且不再为其构建 Win32 版本。现在,每当我尝试引用项目“B”中的新 .tlb 文件时,我都会收到错误提示
"A reference to ...tlb could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component"
我已尝试使用 x86 和 x64 构建“B”项目,但没有任何效果。
我是 COM 对象的新手,所以我在这方面的知识非常有限。我在 VS 2017 中工作。如有任何帮助,我们将不胜感激。
谢谢。
最佳答案
您的描述让我觉得,A 充当 InProc COM 服务器,这意味着架构(x86 或 x64)确实很重要。因此,如果您在更改 A 的体系结构后遇到麻烦,我建议您尝试更多地控制 Runtime Callable Wrapper 的创建,它是从 < em>A 的 .tlb
文件。
请引用https://learn.microsoft.com/en-us/dotnet/framework/tools/tlbimp-exe-type-library-importer用于 TLB-Importer 工具。使用它创建 Runtime Callable Wrapper(又名 interop.*.dll
)并确保添加开关 /machine:x64
。例如。在具有提升的用户权限的终端窗口中运行如下命令以获取 .NET 程序集,它可以由 x64 .NET 程序加载:
tlbimp A.tlb/machine:x64
假设 A.tlb
已正确注册并且您正在 x64 平台上运行(因此 Any CPU 实际上意味着 x64)B 应该能够加载 RCW 并从注册表中引用类型信息。如果这仍然造成一些麻烦,您应该考虑使用 https://learn.microsoft.com/en-us/windows/win32/com/ole-com-object-viewer 仔细查看已注册的类型。 .
关于c# - 通过 COM 对象连接 x64 应用程序时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59006300/