Kevin,这是可能的,但我也同意Kirill的看法,这非常困难。
主要问题在于.idl语言是C/C++特定的,midl编译器生成的代码也是如此。 我以前通过将.idl编译为相应的C/C++客户端/服务器stub,然后将代码翻译成C# PInvoke来实现过。 这种翻译是痛苦的(用大写“P”表示)。 涉及的结构具有循环引用,这使得在C#中相当困难,但并非不可能。
与其与大量接口方法斗争,我们选择了更简单的方法,即单个入口点。 为此,我们的IDL如下所示:
[ uuid (546B0CE0-C70B-1067-B317-00DD010662DA),
version(1.0),
pointer_default(unique)
]
interface IRpcExec
{
error_status_t Exec(
[in] handle_t Binding,
[in] long lDataSize,
[size_is(lDataSize)] byte arData[*],
[out] long *plReturnSize,
[out, size_is(,*plReturnSize)] byte **arReturn
);
}
ACF 然后简单地声明这将返回错误:
interface IRpcExec
{
[comm_status, fault_status]
Exec();
}
有效地,这使我们能够接收一个 byte[],并返回一个 byte[],从而将 RPC 转换成一个简单的传输层而不是一个完整的协议。完整的项目和源代码可从以下位置获取:
http://csharptest.net/browse/src/RpcLibrary/
在这个简单的传输层之上,有一个库可以通过Google协议缓冲区(使用Skeet的protobuf-csharp-port)添加完整功能的RPC机制支持:
https://code.google.com/p/protobuf-csharp-rpc/