gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:30:38 31 4
gpt4 key购买 nike

我有一个现有的 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# 代码?我只是在大声思考。

感谢您的帮助,一些示例代码说明会非常有用。

最佳答案

Kevin,这是可能的,但我也同意 Kirill 的观点,这非常困难。

主要问题是 .idl 语言是特定于 C/C++ 的,就像从 midl 编译器生成的代码一样。我之前通过将 .idl 编译为适当的 C/C++ 客户端/服务器 stub ,然后将代码转换为 C# PInvoke 来完成此操作。这个翻译是痛苦的(大写的“P”)。所涉及的结构具有循环引用,这使得它在 C# 中变得相当困难,但并非不可能。

我们没有与大量接口(interface)方法作斗争,而是选择了更简单的方法,即单一入口点。为此,我们的 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 变成一个简单的传输层,而不是一个成熟的协议(protocol)。完整的项目和源代码可从以下位置获得:

http://csharptest.net/browse/src/RpcLibrary/

在这个简单的传输之上分层的是一个库,用于通过 Google Protocol Buffer (使用 Skeet 的 protobuf-csharp-port)添加对全功能 RPC 机制的支持:

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

关于c# - 如何为 C# 应用程序创建 RPC 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21739660/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com