- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个现有的 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 机制的支持:
关于c# - 如何为 C# 应用程序创建 RPC 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21739660/
我是一名优秀的程序员,十分优秀!