【问题标题】:How to create RPC server for a C# application如何为 C# 应用程序创建 RPC 服务器
【发布时间】:2014-03-11 11:17:54
【问题描述】:

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

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 有一种更好的方法来发现客户端方法的样子。反射是无法击败的。
  • 虽然我必须实现 IDL,但我的问题是如何从我的 C# 应用程序中创建 RPC 服务器。

标签: c# c rpc


【解决方案1】:

凯文,这是可能的,但我也同意基里尔的观点,这非常困难。

主要问题是 .idl 语言是特定于 C/C++ 的,从 midl 编译器生成的代码也是如此。我之前通过将 .idl 编译为适当的 C/C++ 客户端/服务器存根然后将代码转换为 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 协议缓冲区添加对全功能 RPC 机制的支持(使用 Skeet 的 protobuf-csharp-port):

https://code.google.com/p/protobuf-csharp-rpc/

【讨论】:

  • 请原谅我的 necroposting,但我建议未来的读者看看:Microsoft 的 C++/CLI 语言(托管 C++)。最近我遇到了很多跨平台问题,我想编写一个 .NET 库,但有很多对遗留 C/C++ 系统的调用,或者必须将 C 头文件编组到外部系统。 C++/CLI 让它变得简单。 RPC 标头?将它添加到我喜欢 C++/CLI 的理由列表中。
  • 如果我这样做了,它将需要 4 个二进制文件,而不仅仅是 1 个。PInvoke 使这在一个可在 x86/x64 平台上运行的单个 .NET 程序集中成为可能。恕我直言,C++/CLI 集成非常适合内部工作,但在开放库中往往会分崩离析。人们很难构建和分发本机代码,而纯 IL 程序集可以去任何地方。不管你如何到达那里,RPC FTW ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
相关资源
最近更新 更多