我需要在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上运行跨进程参数传递的东西是错误的,但即使在谷歌搜索几个小时后我也找不到答案。
有什么想法吗?
答案 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 );