.net - 在 64 位 .NET 应用程序中使用 32 位非托管 COM 服务器

标签 .net com 64-bit com-interop unmanaged

我需要在 64 位 .NET 应用程序中使用 32 位非托管 COM 服务器。

我做了一些研究,似乎找到了一个合适的解决方案:在 COM+ 服务器应用程序 中托管 COM 服务器。因此,该组件在专用(32 位)进程中激活,并通过 RPC 与 64 位进程通信。 ( link )

为了测试以上内容,我创建了一个示例 COM 服务器并将其注册到 COM+ 应用程序中。它的界面是这样的:

interface ITestComObj: IUnknown
{
  HRESULT _stdcall Ping( void );
  HRESULT _stdcall Uppercase([in] LPSTR input, [out, retval] LPSTR * output );
};

然后我创建了一个简单的 .NET 控制台应用程序,它通过 COM 互操作调用这些方法。

首先,我在 32 位 WinXP 上对其进行了测试,它运行良好。

然后我转移到 64 位 Win7。第一次调用(对无参数 Ping() 方法)成功,但第二次调用抛出异常(经过一段时间等待):远程过程调用失败。 (HRESULT 异常:0x800706BE)。

我做了一些进一步的调查。我强制客户端进入 32 位进程(将其构建到 x86 目标平台)以查看是否有任何变化,但结果是一样的。但是,如果我切换到进程内激活(将 COM+ 应用程序类型更改为库应用程序),则客户端可以正常工作。

显然,跨进程参数传递在 Win7 上出错了,但我在谷歌上搜索了几个小时也找不到答案。

有什么想法吗?

最佳答案

问题在于编码——无论出于何种原因,互操作层都无法正确编码第二个调用参数。我建议您更改签名以使用 arrays with size_is attribute .

关于.net - 在 64 位 .NET 应用程序中使用 32 位非托管 COM 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6686705/

相关文章:

.net - DisplaySettingsChanging 上的 WPF 互操作死锁

c# - CLR 在调用结构的方法时如何工作

c++ - Lotus Notes Automation:Notes.NotesSession 没有实现 Domino::ISession?

c# - C# 中奇怪的 COM 对象行为

c# - 如何将 app.config 添加到 Visual Studio 2012 Web Express lib 项目?

javascript - 在浏览器地址栏中使用 Javascript 代码填写表单

debugging - 如何让 Microsoft Script Debugger 与 64 位 Windows 7 一起使用?

.net - 64位平台编程

visual-studio-2015 - Visual Studio 2015 表达缺少 amd64 选项

.net - 在目标服务器上安装 .net 4 项目 - 错误 System.BadImageFormatException