通过 COM 对象连接 x64 应用程序时出现问题
Problems connecting x64 application through COM objects
我们有一个在 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[= 的创建33=],它是从 A 的 .tlb
文件中创建的。
TLB-Importer 工具请参考https://docs.microsoft.com/en-us/dotnet/framework/tools/tlbimp-exe-type-library-importer。使用它创建 Runtime Callable Wrapper (a.k.a. interop.*.dll
) 并确保添加开关 /machine:x64
。例如。 运行 在终端 window 中使用提升用户权限的命令来获取 .NET 程序集,它可以由 x64 .NET 程序加载:
tlbimp A.tlb /machine:x64
前提是 A.tlb
已正确注册并且您 运行ning 在 x64 平台上(因此 Any CPU 确实意味着 x64) B 应该能够加载 RCW 并从注册表中引用类型信息。如果这仍然造成一些麻烦,您应该考虑使用 https://docs.microsoft.com/en-us/windows/win32/com/ole-com-object-viewer.
仔细查看已注册的类型
我们有一个在 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[= 的创建33=],它是从 A 的 .tlb
文件中创建的。
TLB-Importer 工具请参考https://docs.microsoft.com/en-us/dotnet/framework/tools/tlbimp-exe-type-library-importer。使用它创建 Runtime Callable Wrapper (a.k.a. interop.*.dll
) 并确保添加开关 /machine:x64
。例如。 运行 在终端 window 中使用提升用户权限的命令来获取 .NET 程序集,它可以由 x64 .NET 程序加载:
tlbimp A.tlb /machine:x64
前提是 A.tlb
已正确注册并且您 运行ning 在 x64 平台上(因此 Any CPU 确实意味着 x64) B 应该能够加载 RCW 并从注册表中引用类型信息。如果这仍然造成一些麻烦,您应该考虑使用 https://docs.microsoft.com/en-us/windows/win32/com/ole-com-object-viewer.