我需要在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上跨进程参数传递出现了问题,但即使搜索了几个小时,我也找不到答案。
有任何想法吗?