c# - 通过 COM 对象连接 x64 应用程序时出现问题

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

我们有一个在 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/

相关文章:

c# - 尝试设置委托(delegate)和处理程序以仅使用操作键动态调用

c++ - QWidget::repaint:更新进度条时检测到递归重绘

c++ - 假设数组为 'bool' ,那么 'a[n] == (-1)' 可以为真吗?

c# - pinvokestackimbalance - 我该如何解决或关闭它?

c# - 如何从 Azure Active Directory( native 应用程序)获取用户列表?

c# - 如何限制我的 Windows 应用程序生成进程的单个实例?

c# - 是否可以在 C# 中覆盖 DateTime.ToString() 函数

c++ - 段错误后 GDB 不返回

c++ - 如何解读visual studio的callstack?

sql - Getdate() 等效于 Jet/Access 数据库。需要上个月的记录