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

时间:2011-07-13 23:03:06

标签: .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 interop调用这些方法。

首先,我在32位WinXP上测试它,它工作正常。

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

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

显然,在Win7上运行跨进程参数传递的东西是错误的,但即使在谷歌搜索几个小时后我也找不到答案。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我的问题可能在于字符串类型的编组。我会尝试使用:

HRESULT _stdcall Uppercase([in] BSTR input, [out, retval] BSTR * output );

而不是

HRESULT _stdcall Uppercase([in] LPSTR input, [out, retval] LPSTR * output );