title author date CreateTime categories
WPF 使用RPC调用其他进程
lindexi
2018-06-24 14:41:29 +0800
2018-2-13 17:23:3 +0800
dotnetremoting rpc WPF

如果在 WPF 需要用多进程通信,一个推荐的方法是 WCF ,因为 WCF 是 RPC 计算。先来讲下 RPC (Remote Procedure Call) 远程过程调用,他是通过特定协议,包括 tcp 、http 等对其他进程进行调用的技术。详细请看百度

现在不会告诉大家如何使用 WCF ,下面讲的是使用 remoting 这个方法。需要知道 dotnet remoting 是已经过时的技术,建议使用 wcf 但是 wcf 部署难度比较高,对于性能要求比较高或想快速使用,建议使用 remoting 。使用方法很简单

如果不想知道具体是怎么做,只想使用,那么请看WPF 封装 dotnet remoting 调用其他进程,欢迎加入dotnet 职业学院任何问题都可以在群里交流

首先创建三个工程,一个工程放其他两个需要使用的库,一个是服务端,一个是客户端。其中客户端就可以调用服务端,客户端和服务端是两个不同的进程,所以可以跨进程调用。

先创建一个简单的工程,库的工程 RemoteObject ,里面只有一个类

  public class RemoteCalculator : MarshalByRefObject
{
public const int Port = 13570; public int Add(int a, int b)
{
return a + b;
}
}

注意这个类需要继承 MarshalByRefObject ,这个类是在两个进程引用,客户端不实现这个类,所以客户端使用这个类接口同样可以。具体调用这个类的方法在服务端运行,结果通过 tcp 或 http 返回。

客户端的主要代码是连接服务端,然后访问库的 add 函数,但是这个函数不在客户端运行,通过 tcp 调用服务端,让他运行。

       private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
if (_channel == null)
{
Process.Start("CalcnsMnlhzydYeuiitcCddhxvlhm.exe");
_channel = new TcpChannel();
ChannelServices.RegisterChannel(_channel, true);
}
var calculator = (RemoteCalculator) Activator.GetObject(typeof(RemoteCalculator),
"tcp://" + "127.0.0.1" + ":" + RemoteCalculator.Port + "/RemoteCalculator");
Console.WriteLine(calculator.Add(1, 2));
}

服务端的名称是 CalcnsMnlhzydYeuiitcCddhxvlhm ,主要是打开连接,执行客户端发过来的函数

        static void Main(string[] args)
{
new Thread(() =>
{
_channel = new TcpChannel(RemoteCalculator.Port); ChannelServices.RegisterChannel(_channel, true);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteCalculator), "RemoteCalculator", WellKnownObjectMode.Singleton);
}).Start();
while (true)
{
Console.ReadKey();
}
} private static TcpChannel _channel;

需要注意,客户端点击按钮需要先打开服务端,使用这个代码Process.Start("CalcnsMnlhzydYeuiitcCddhxvlhm.exe");然后创建 tcp 告诉通过tcp和服务端连接。然后从服务端获得 calculator 这个类,实际这个类现在是没有实现,调用函数需要发送到服务端。

服务端需要打开 TcpChannel ,这时需要定义调用的类,RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteCalculator), "RemoteCalculator", WellKnownObjectMode.Singleton);,这个函数的一个参数就是注册的类,第二个函数是调用的这个类使用什么名称,一般都是使用类的名称,最后一个参数可以在一个连接给一个实例。所以在库的类不能在构造函数需要传入

客户端调用的"tcp://" + "127.0.0.1" + ":" + RemoteCalculator.Port + "/RemoteCalculator"最后一个RemoteCalculator就是服务端注册的第二个函数。

那么这个功能的作用是什么?因为 x64 程序不能调用 x86 的库,所以可以用这个方法在 x64 的程序调用其他平台的库,因为进程运行的平台不一样,但是通信是相同。

其他的功能我没有使用,我就使用打开服务,调用他的函数,所以如果大家遇到问题,不要来问我。如果按照我的代码无法运行,可以发邮件给我,我发源代码给你

代码下载:网盘

更多关于 WPF dotnet remoting RPC 的博客请看

.net remoting 使用事件

.net remoting 抛出异常

如果不想知道那么多,想要快速开始,请看

WPF 封装 dotnet remoting 调用其他进程

最新文章

  1. .NET Core的日志[3]:将日志写入Debug窗口
  2. CSS3实现加载中效果
  3. 转AjaxControlToolkit的安装与使用详解
  4. ionic介绍
  5. 域用户直接登陆(C#,MVC)
  6. EasyUI基础入门之Parser(解析器)
  7. Nhibernate中 Many-To-One 中lazy="proxy" 延迟不起作用的原因
  8. 百度bae定时任务使用方法
  9. HTML5简介、视频
  10. Winform 实现像菜单一样弹出层
  11. IIS优化服务器性能导致QuartZ任务未运行
  12. mysql5.6 无法使用64odbc连接
  13. [Swift]LeetCode952. 按公因数计算最大组件大小 | Largest Component Size by Common Factor
  14. SVN拉取后撤销,恢复未拉取之前的状态
  15. json_decode()相关报错
  16. Python学习之路【第二篇】-pyc简介、Python常用的数据类型及其用法和常用运算符
  17. 【Unity】3.2 利用预设(Prefab)制作可复用的组件
  18. html5 初试 indexedDB
  19. iOS 5解决Could not instantiate class named NSLayoutConstraint问题
  20. git使用笔记(十四)cat-file

热门文章

  1. git命令移动文件夹到另一文件夹
  2. Mysql查询优化-DB篇
  3. Spring Boot → 01:概要
  4. IDEA 创建文件夹总默认根节点问题解决
  5. Python数据分析与展示[第一周]
  6. Python 中的 map, reduce, zip, filter, lambda基本使用方法
  7. Hdu 4143
  8. hpacucli工具linux系统下重做阵列
  9. poj3463&&hdu1688 次短路(dijkstra)
  10. jreble for eclipse配置