C# 简单的进程间通信方式
只想实现一个简单的进程建通信,有什么快速实现方式?
1 进程单例需求 / Windows 消息与 IMessageFilter
如果需求是实现一个进程单例,在启动第二个进程时,期望能自动唤起第一个进程的窗口。
可以参见:
C#/WPF 仅启动一个进程实例 - J.晒太阳的猫 - 博客园
但有个问题,如果实现了最小化到托盘(WPF/.net core WPF 系统托盘支持)这个功能,则这个唤醒将会失效。
原因:窗口隐藏之后,将不会接收到 windows 消息。详情和怎么解,可以看: C#向无窗口的进程发送消息_C#教程_脚本之家
但这个实现依赖于 WinForm,在 WPF 下是不生效的。(Message Filters in WPF ?)

所以,如果是 WinForm 程序,可以通过 IMessageFilter 实现简单的进程间通信,发个指令还是 OK 的。
2 WPF 程序
WPF 可以使用远程代理实现。
RemotingServices 类 (System.Runtime.Remoting) | Microsoft Docs
简单的实现如下:
- 服务端(被调用端)
// 服务端可以被代理调用的类
internal class OneServiceRemoteProvider : MarshalByRefObject
{
public string DoSomething(string parameter)
{
// do something
}
}
// 服务端初始化代码:
public const string ServiceIpcPortName = "B7262FBA-0498-46BF-B4D5-E6D54A1A636B"; // 定义一个 IPC 端口
var remoteProvider = new OneServiceRemoteProvider();
// 将 remoteProvider/OneServiceRemoteProvider 设置到这个路由,你还可以设置其它的 MarshalByRefObject 到不同的路由。
RemotingServices.Marshal(remoteProvider, "one");
ChannelServices.RegisterChannel(new IpcChannel(ServiceIpcPortName), false);
- 客户端(调用端)
var oneRemoteProvider = (OneServiceRemoteProvider)Activator.GetObject(typeof(OneServiceRemoteProvider), $"ipc://{ServiceIpcPortName}/one");
// 在这里就可以通过 oneRemoteProvider 实现对服务端的远程调用了。
其它问题:
1 参数仅能传递基础类型,不支持事件和委托,如果传递引用类型,需要可序列化。
2 这里的服务端和客户端只是逻辑概念,只要知道对方的 IPC 端口号和路由地址,就可以实现调用。
3 .net core / .net core WPF 程序
.net core 已经不在提供 Remoting 的支持,.NET Framework technologies unavailable on .NET Core - .NET Core | Microsoft Docs
所以,得另想办法,微软官方推荐的就是 Pipe . System.IO.Pipes Namespace | Microsoft Docs
在 .net framework 下也可以用。
Pipe 使用示例:
c# - Example of Named Pipes - Stack Overflow
可以使用或参考:dotnet-campus/dotnetCampus.IPC.WCF: 一个基于WCF适用于C#项目进行IPC通信的库
原文链接:
C# 简单的进程间通信方式 - J.晒太阳的猫 - 博客园
C# 简单的进程间通信方式的更多相关文章
- 【转】进程间通信方式总结(windows 和linux)
平时看的书很多,了解的也很多,但不喜欢总结,这不昨天面试的时候被问到了进程间通信的方式,因为没有认真总结过,所以昨天答得不是特别好.现在将linux和windows的进程间通信方式好好总结一下. ...
- Linux下进程间通信--共享内存:最快的进程间通信方式
共享内存: 一.概念: 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A.B各自的进程地址空间. 进程A可以即时看到进程B ...
- 最快的进程间通信方式你get了么
前言:天下武功为快不破!在信息爆炸.快速发展的新时代...,扯远了....进程间通信方式有很多,但最快的方式你知道么?由我娓娓道来... 一.共享内存方式 主角闪亮登场了,噔噔瞪...,最快的方式就是 ...
- Android六大进程间通信方式总结之一:基本知识
因为不同进程都是享有独立资源的,所以全局变量这些都是无效的,必须有其他的进程间通信方式. 一.基本知识 1:怎样使用多进程 Android正常使用的多进程的办法只有一种,就是在Service或Acti ...
- JavaScript高级 面向对象(5)--最简单的继承方式,混入mix
说明(2017.3.30): 1. 最简单的继承方式,混入mix <!DOCTYPE html> <html lang="en"> <head> ...
- IPC 进程间通信方式——管道
进程间通信概述 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到. 通知时间: ...
- unix进程间通信方式(IPC)
unix进程间通信方式(IPC) 管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信. 命名管道(named pipe):命名管道克服了管道没有 ...
- Linux下进程间通信方式——共享内存
1.什么是共享内存? 共享内存就是允许两个或多个进程共享一定的存储区.就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针.当一个进程改变了这块地址中的内容的时候,其它进程都会察 ...
- 用简单直白的方式讲解A星寻路算法原理
很多游戏特别是rts,rpg类游戏,都需要用到寻路.寻路算法有深度优先搜索(DFS),广度优先搜索(BFS),A星算法等,而A星算法是一种具备启发性策略的算法,效率是几种算法中最高的,因此也成为游戏中 ...
随机推荐
- 使用Castle DynamicProxy (AOP)
在本文中,我将引导您了解.NET环境中的面向方面编程(AOP)概念,以及如何使用Castle DynamicProxy创建和附加方面.在我们开始之前,让我快速介绍AOP和 IoC.如果您已经熟悉这些 ...
- 在CV尤其是CNN领域的一些想法
现在的CNN还差很多,未来满是变数. 你看,现在的应用领域也无非merely就这么几类----分类识别,目标检测(定位+识别),对象分割......,但是人的视觉可不仅仅这么几个功能啊!是吧. 先说说 ...
- 编码方式ASCII、GBK、Unicode、UTF-8比较
文章内容深度较浅,详细了解可到下链接:https://blog.csdn.net/QuinnNorris/article/details/78705723; 总结了以下几种编码方式: ASCII.GB ...
- Java入门系列之集合Hashtable源码分析(十一)
前言 上一节我们实现了散列算法并对冲突解决我们使用了开放地址法和链地址法两种方式,本节我们来详细分析源码,看看源码中对于冲突是使用的哪一种方式以及对比我们所实现的,有哪些可以进行改造的地方. Hash ...
- Spring Boot AOP解析
Spring Boot AOP 面向切面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关键单元是类,而在AOP中,模块化单元是方面. AOP(Aspec ...
- java基础(1):java概述、jdk的安装、环境变量的配置、helloworld案例
1. Java开发环境搭建 1.1 java概述 众所周知Java是一门编程语言,编程语言就是用来编写软件的.那么使用Java到底能用来编写什么软件呢?你所熟知的很多软件都可以用Java来编写,例如: ...
- DevExpress的TreeList实现显示本地文件目录并自定义右键实现删除与重命名文件
场景 使用DevExpress的TreeList显示本磁盘下文件目录并在树节点上右键实现删除与添加文件. 效果 自定义右键效果 实现 首先在包含Treelist的窗体的load方法中对treelist ...
- git合并多次commit提交
在开发项目工程中经常会遇到为了一个需求产生多次提交记录.有些是可以接受的,比如按照功能点不同进行的提交.但往往会存在这种,只为了一个小东西进行改动,比如多余文件的提交.书写不规范而不得不提交的情况.多 ...
- 资深架构师教你String 常量池、 String.itern()
什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变! final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. Class文件中的常量池 在Class文件结 ...
- Cesium专栏-空间分析之坡向分析(附源码下载)
Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...