如何为C#应用程序创建RPC服务器

4

我有一个现有的C#应用程序,想将其用作RPC服务器,以便远程RPC客户端可以调用其中的C#函数。我已经搜索并阅读了Microsoft RPC架构的Windows SDK。它只使用C / C ++创建RPC服务器应用程序,需要生成IDL、ACF文件并使用MIDL编译器。

Microsoft RPC服务器教程: http://msdn.microsoft.com/en-us/library/windows/desktop/aa378869(v=vs.85).aspx

是否有办法让我使用现有的C#应用程序作为RPC服务器以在这种RPC架构中工作?也许是RPC服务器C包装器代码调用我的C#代码?我只是随口一说。

谢谢你的帮助,一些示例代码说明将非常有用。


这个问题有很大的问题。如果您正在这样做是因为必须与现有的RPC客户端通信,那么您应该问“我该如何处理IDL或头文件?”如果您没有一个停止在那里,它不会起作用。如果您实际上没有真正的RPC客户端,那么您就永远不应该使用RPC,.NET有一种更优越的方法来发现客户端方法的外观。反射是无法击败的。 - Hans Passant
虽然我必须实现一个IDL,但我的问题是如何从我的C#应用程序创建RPC服务器。 - Kevin
1个回答

5

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/


抱歉我发了个老贴,但我可以建议未来的读者看一下:微软的C++/CLI语言(托管C++)。最近我遇到了很多跨平台问题,我想编写一个.NET库,但有很多调用传统的C/C++系统,或者必须将C头文件转换为外部系统。C++/CLI使这变得容易。RPC头文件?加入到我喜欢C++/CLI的原因列表中。 - ChuckZ
如果我那样做的话,就需要四个二进制文件而不是一个。PInvoke 可以在单个 .NET 程序集中实现这一点,可以在 x86/x64 平台上运行。在我看来,C++/CLI 集成对于内部项目非常棒,但在开放库中容易出现问题。人们很难构建和分发本地代码,而纯 IL 程序集可以到达任何地方。无论如何,RPC 肯定是胜利者 ;) - csharptest.net
http://csharptest.net/browse/src/RpcLibrary/ 是一个失效的链接。新链接:https://github.com/csharptest/CSharpTest.Net.RpcLibrary - user13430089

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接