WPF 从零开始开发 dotnet Remoting 程序
本文告诉大家如何不使用框架,从零开始开发一个 dotnet remoting 程序
在我的另一篇博客 WPF 使用RPC调用其他进程 就大概告诉了大家如何在 WPF 使用 dotnet remoting 但是这篇博客是从大的方向告诉大家,所以本文就从代码上告诉大家如何写一个 dotnet remoting 做多进程框架。
首先需要创建几个项目,下面就是本文创建的项目
Native
WPF 程序
Remote
控制台项目
RemoteObject
类库
引用项目
这里几个项目的应用关系是 Native 引用 Remote 和 RemoteObject 。在 Remote 项目引用 RemoteObject 项目。
这里的 Native 项目就是本地的 WPF 程序,而 Remote 控制台项目就是远程的进程,本文让 Native 作为主进程,让 Remote 进程做远程。
这里的 RemoteObject 就是放一些在 Native 和 Remote 都需要使用的类。
通过每个项目的用法就可以知道引用,因为我需要从 Native 启动 Remote ,在 VisualStudio 只要引用一个项目就可以让这个项目输出到项目所在的输出文件,所以就可以快速找到 Remote 进程。
现在尝试创建三个不同的项目,然后编译一下,这时就可以从 Native 的输出文件夹看到下面的文件

启动软件
在 Native 启动 Remote 很简单,因为在相同的文件夹,所以使用下面的代码启动
因为 Remote 只是一个控制台项目,为了让用户可以看到 Remote 就需要在主函数添加一些代码
static void Main(string[] args)
{
Console.WriteLine("启动远程应用");
while (true)
{
Console.Read();
}
}
然后在 Native 的主页面添加下面代码
public MainWindow()
{
InitializeComponent();
var processStartInfo = new ProcessStartInfo(ProgressName);
Process.Start(processStartInfo);
}
private const string ProgressName = "Remote.exe";
现在运行一下 Native 就可以看到 Remote 也运行
注册类
现在尝试在远程 Remote 注册一个类,然后在本地调用 Remote 的这个类
先创建一个类请看代码
[Serializable]
public class Addition : MarshalByRefObject
{
public int Add(int a, int b)
{
return a + b;
}
}
这个类先放在 RemoteObject 这样就可以在 Native 和远程都知道这个类
注册一个类的方法有很多个,本文只告诉大家通过 RemotingServices.Marshal 的方式注册
因为在 Remote 的主函数是等待输入也就是这个线程是无法使用,所以需要新创建一个线程
static void Main(string[] args)
{
Console.WriteLine("启动远程应用");
var thread = new Thread(() =>
{
var addition = new Addition();
RemotingServices.Marshal(addition, "add");
})
{
IsBackground = true,
};
thread.Start();
while (true)
{
Console.Read();
}
}
现在就通过 RemotingServices.Marshal 注册了 Addition 类。
添加通道
为了让 Native 可以访问到 Remote 就需要 Remote 添加 Channel 让 Native 访问
在添加通道之前需要添加 .Net Remoting 的引用,右击三个项目添加引用,选择 System.Runtime.Remoting 和 System.Runtime.Serialization 第一个就是基础支持第二个是用来序列化

使用下面的代码创建 TCPChannel 传入的参数就是端口
private static IChannel CreatChannel()
{
var tcpServerChannel = new TcpServerChannel(8086);
return tcpServerChannel;
}
在传入的时候需要本地不存在冲突端口,也就是现在的端口没有被其他程序使用
通过这个方法就可以创建,创建之后需要注册,使用 ChannelServices.RegisterChannel 方法就可以注册,这个方法第二个参数是要不要使用安全传输
static void Main(string[] args)
{
Console.WriteLine("启动远程应用");
var thread = new Thread(() =>
{
var addition = new Addition();
RemotingServices.Marshal(addition, "add");
_channel = CreatChannel();
ChannelServices.RegisterChannel(_channel, false);
})
{
IsBackground = true,
};
thread.Start();
while (true)
{
Console.Read();
}
}
private static IChannel _channel;
private static IChannel CreatChannel()
{
var tcpServerChannel = new TcpServerChannel(8086);
return tcpServerChannel;
}
现在就在 Remote 的准备完成了
在 Native 也需要注册通道才可以和 Remote 通信,在 Native 注册的 TCPChannel 是使用 TcpClientChannel 类,请看代码
public MainWindow()
{
InitializeComponent();
var processStartInfo = new ProcessStartInfo(ProgressName);
Process.Start(processStartInfo);
var tcpClientChannel = new TcpClientChannel();
ChannelServices.RegisterChannel(tcpClientChannel, false);
}
现在就注册完成了,下面就是从 Native 调用远程的类
调用方法
在 Native 的界面添加一个按钮,在按钮按下的时候就触发 Remote 的类的函数
这里关于在 Native 的界面添加按钮和按钮事件本文就不说了,因为很简单。
在按钮按下的代码使用 Activator.GetObject 方法拿到远程的类
private void Button_OnClick(object sender, RoutedEventArgs e)
{
var addition = (Addition) Activator.GetObject(typeof(Addition), "tcp://localhost:8086/add");
Debug.WriteLine(addition.Add(1, 2));
}
这里通过 8086 端口拿到刚才注册的 Addition 类,需要重新告诉大家 Addition 是如何注册的
RemotingServices.Marshal(addition, "add");
在 RemotingServices 的 Marshal 第一个参数就是需要注册的类,第二个就是拿到这个类的链接
所以通过 tcp://localhost:8086/add 就可以拿到远程的类
现在点击按钮就可以看到输出 3 为了让大家知道是调用远程的方法,在 Addition 类添加输出
public int Add(int a, int b)
{
Console.WriteLine(" 调用加法");
return a + b;
}
现在在 Native 按下按钮就可以看到 Native 的 VisualStudio 输出 3 同时 Remote 控制台输出 调用加法
上面就是最简单的使用 dotnet remoting 的例子,在接下来将会分为不同的细节来写很多篇博客。
先回忆一下,创建一个 .Net Remoting 需要经过哪些步骤
让 Native 引用 Remote 这样就可以让 Native 启动 Remote
Remote 启动之后需要注册类,也就是给 Native 使用的类需要先注册
为了让 Native 和 Remote 通信就需要注册通信
通过 Activator.GetObject 拿到 Remote 的类返回透明代理
在 Native 通过 透明代理调用 Remote 的方法

在这个过程中几乎所有步骤都可以拿出来说
如果不想了解太多细节,想快速使用,请看WPF 封装 dotnet remoting 调用其他进程
参见:
Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触 - 张逸 - 博客园
Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务 - 张逸 - 博客园
Ingo Rammer,《Advanced .NET Remoting》
《Professional C#》 第3版
.NET Remoting程序开发入门篇-博客-云栖社区-阿里云
.NET Remoting中的事件处理(.NET Framework 2.0)(一) - 大坏蛋 - 博客园
我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新
如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
WPF 从零开始开发 dotnet Remoting 程序的更多相关文章
- 使用 Tye 辅助开发 dotnet 应用程序
newbe.pro 已经给我们写了系列文章介绍Tye 辅助开发k8s 应用: 使用 Tye 辅助开发 k8s 应用竟如此简单(一) 使用 Tye 辅助开发 k8s 应用竟如此简单(二) 使用 Tye ...
- 使用VS Code 从零开始开发并调试.NET Core 应用程序
最新文章:http://www.cnblogs.com/linezero/p/VSCodeNETCore.html 使用VS Code 从零开始开发并调试.NET Core 应用程序,C#调试. 上一 ...
- WPF 封装 dotnet remoting 调用其他进程
原文:WPF 封装 dotnet remoting 调用其他进程 本文告诉大家一个封装好的库,使用这个库可以快速搭建多进程相互使用. 目录 创建端口 调用软件 运行的类 运行C++程序 通道 使用 在 ...
- ubuntu上部署windows开发的dotnet core程序
目标:完成windows上开发的dotnet core程序部署至linux服务器上(Ubuntu 14.04) windows上开发dotnet core很简单,安装好VS2017,建立相关类型的项目 ...
- 微信小程序从零开始开发步骤(八)引入框架WeUI
首先来看下WeUI的官方介绍: WeUI 是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,令用户的使用感知更加统一.在微信小程序的开发过程中,涉及到的前端 ...
- 微信小程序从零开始开发步骤(七)引入外部js 文件
上一章讲到小程序页面的四种常见的跳转的方法,这一章写如何引入一个外部的js文件,既utils文件夹的用处,其实步骤很简单: 1:准备好外部想要引入的外部文件,命名为util.js,并且填充固定的文件内 ...
- 微信小程序从零开始开发步骤(六)4种页面跳转的方法
用法:用于页面跳转,相当于html里面的<a></a>标签. API教程:https://mp.weixin.qq.com/debug/wxadoc/dev/component ...
- 微信小程序从零开始开发步骤(五)轮播图
上一章完成页面自定义分享,这一章来说说轮播图,最常见的一个轮播图,中间带小圆点,自动轮播. Swiper是滑动特效插件,面向手机.平板电脑等移动终端.能实现触屏焦点图.触屏Tab切换.触屏多图切换等常 ...
- 微信小程序从零开始开发步骤(四)自定义分享的功能
上一章节,实现了小程序的底部导航的功能,这一节开始实现一些简单的功能.本章节介绍的是小程序的自定义分享的功能. 可以分享小程序的任何一个页面给好友或群聊.注意是分享给好友或群聊,并没有分享到朋友圈.一 ...
随机推荐
- Linux常用命令3 文件搜索命令
文件搜索非常占用资源,所以尽量不要使用这个命令 避免少用该命令最好的方式是设置好文件夹结构,文件不要乱放 1.文件搜索命令:find 命令名称:find 所在路径:/bin/find 执行权限:所有用 ...
- SPSS和Mplus如何做非线性中介调节效应分析?如倒U形曲线
SPSS和Mplus如何做非线性中介调节效应分析?如倒U形曲线 传统的线性回归模型用的比较多,但有时候变量之间的关系更符合非线性关系,此时使用非线性模型其拟合度会更好,模型预测效果更佳.在非线性关系中 ...
- js的下拉刷新和上拉加载,基于iScroll v4.2.5
html部分 <div id="wrapper" style="height: 100%"> <div id="scroller&q ...
- celery 动态定时任务探索
环境: celery 4.3 flask python 3.7 linux 需求: 动态添加定时任务,且方便维护. 解决思路: 参考django-celery 或是celery源码,将定时任务配置放置 ...
- Oracle使用——Oracle表字段的增加、删除、修改和重命名
增加字段 语法 alter table tablename add (column datatype [default value][null/not null]); 说明:alter table 表 ...
- laravel 极验(Geetest) 让验证更安全。
整理的有些仓促,在9月15号之后会更新更加详细更加全面的文档,供给大家参考,学习! 1.简述 在网站开发中使用频率最高的工具之一便是验证码,验证码在此也是多种多样,不过简单的图片验证码已经可以被机器识 ...
- (转)理解inode
作者:阮一峰 原文链接:http://www.ruanyifeng.com/blog/2011/12/inode.html 一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上 ...
- javascript中数字的一些常规操作
1,禁止输入 - (减号.负号) // html <input type="number" class="no-negative"> // js $ ...
- c++第四次作业:继承
继承与派生 基本概念和语法 概念 继承与派生是同一过程从不同角度看 保持已有的特性而构造新类的过程称为继承. 在已有类的基础上新增自己的特性而产生新类的过程为派生. 被继承的已有类称为基类(父类) 派 ...
- 在 VirtualBox 安装 Centos Docker-CE
在 VirtualBox 安装 Centos Docker-CE 因为需要测试环境,安装了一个 CentosOS 7. 安装结束后发现没有 IP,开始以为是因为 NAT 设置问题. 把网络设置为桥联, ...