我需要在 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/