WPF 使用RPC调用其他进程
如果在 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 的博客请看
如果不想知道那么多,想要快速开始,请看
我搭建了自己的博客 https://lindexi.gitee.io/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新
如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
WPF 使用RPC调用其他进程的更多相关文章
- 2018-6-24-WPF-使用RPC调用其他进程
title author date CreateTime categories WPF 使用RPC调用其他进程 lindexi 2018-06-24 14:41:29 +0800 2018-2-13 ...
- WPF 封装 dotnet remoting 调用其他进程
原文:WPF 封装 dotnet remoting 调用其他进程 本文告诉大家一个封装好的库,使用这个库可以快速搭建多进程相互使用. 目录 创建端口 调用软件 运行的类 运行C++程序 通道 使用 在 ...
- 闲话RPC调用
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 自SOA架构理念提出以来,应用程序间如何以最低耦合度通信的问题便呈现在所有架构师面前. 互联网系统的复杂度让我们不 ...
- Hadoop学习记录(3)|HDFS API 操作|RPC调用
HDFS的API操作 URL方式访问 package hdfs; import java.io.IOException; import java.io.InputStream; import java ...
- 浅谈RPC调用
RPC英文全称remote procedure call 翻译成中文的意思就是远程过程调用.RPC的出现其实主要是为了解决分布式系统间的通信透明性的问题. 那什么是分布式系统的通信透明性问题?这个问题 ...
- WPF中用于嵌入其他进程窗口的自定义控件(AppContainer)
原文:WPF中用于嵌入其他进程窗口的自定义控件(AppContainer) 版权声明:本文为博主原创文章,转载请注明作者和出处 https://blog.csdn.net/ZZZWWWPPP11199 ...
- aria2使用ajax调用/页面浏览器RPC调用aria2
@ 目录 1. aria2使用ajax调用/页面浏览器RPC调用aria2 1.1. 总结: 1.2. ajax调用aria2-Demo 1.3. postMan命令测试 1.3.1. post基本使 ...
- RabbitMQ学习笔记5-简单的RPC调用
利用空的queue名字("")让rabbitMQ生成一个唯一的队列名称,同时指定队列是:临时的(auto-delete).私有的(exclusive). 在发送的RPC调用消息里设 ...
- 使用RPC 调用NameNode中的方法
用户在Client 端是很难对 NameNode中的信息进行直接访问的, 所以 ,在Hadoop系统中为 Client端 提供了一系列的方法调用,这些方法调用是通过RPC 方法来实现的, 根据RPC ...
随机推荐
- 别人的Linux私房菜(5)首次CentOS7与帮助等
ctrl alt F1-F6切换终端tty1-6,其中,F1的终端带有用户界面. 在终端登录后,输入startx启动个人图形界面.(启动有一些条件限制,如没有其他的X Window启用,已经安装,并具 ...
- js 新增标签、标签属性
var table = document.getElementById('content_list'); console.log(ret.data.length); ;i<ret.data.le ...
- 综合数据api接口使用
由于请求数据接口是跨域的,但是我们无法改变接口的代码 先从请求后台,然后从后台进行二次请求,请求数据接口 原生代码 package edu.nf.http.test; import org.apach ...
- git(转载谢谢)
Git可视化极简易教程 —— Git GUI使用方法 (新版的git默认已不能自行选择中文语言了) 前言 之前一直想一篇这样的东西,因为最初接触时,我也认真看了廖雪峰的教程,但是似乎我觉得讲得有点 ...
- break语句和continue语句
1. break 语句 break语句只能用在switch语句中,其作用是跳出switch语句或跳出本层循环. 2. continue 语句 continue语句只能用在循环体中,用于结束本次循环,即 ...
- FZU.Software Engineering1816 ·The Second Assignment of the Team
1.Team Leader Link: 柯奇豪:点我 2.NABCD Model: Need(需求)——客户需求是什么? *. 希望能够有一款集成日常办公所需功能的软件(如:想法搜集.投 ...
- API网关设计(一)之Token多平台身份认证方案(转载)
原文:https://segmentfault.com/a/1190000018535570?utm_source=tag-newest 概述 今天咱们面对移动互联网的发展,系统一般是多个客户端对应一 ...
- iostat 命令详解
前言 话说搞运维的人没有两把"刷子",都不好意思上服务器操作.还好,我还不是搞运维的,我一直都自诩是开发人员,奈何现在的东家运维人员"水"的一比,还要我这个自诩 ...
- Adobe reader multiple languages pack
用户打开客户发过来的PDF文档,显示不正常,这是电脑的Adobe Reader缺少相关的字体. 可以从下面地址下载相对版本的字体包安装:http://supportdownloads.adobe.co ...
- MyBatis 源码分析 - 内置数据源
1.简介 本篇文章将向大家介绍 MyBatis 内置数据源的实现逻辑.搞懂这些数据源的实现,可使大家对数据源有更深入的认识.同时在配置这些数据源时,也会更清楚每种属性的意义和用途.因此,如果大家想知其 ...