只想实现一个简单的进程建通信,有什么快速实现方式?

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# 简单的进程间通信方式的更多相关文章

  1. 【转】进程间通信方式总结(windows 和linux)

    平时看的书很多,了解的也很多,但不喜欢总结,这不昨天面试的时候被问到了进程间通信的方式,因为没有认真总结过,所以昨天答得不是特别好.现在将linux和windows的进程间通信方式好好总结一下.    ...

  2. Linux下进程间通信--共享内存:最快的进程间通信方式

    共享内存: 一.概念: 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A.B各自的进程地址空间. 进程A可以即时看到进程B ...

  3. 最快的进程间通信方式你get了么

    前言:天下武功为快不破!在信息爆炸.快速发展的新时代...,扯远了....进程间通信方式有很多,但最快的方式你知道么?由我娓娓道来... 一.共享内存方式 主角闪亮登场了,噔噔瞪...,最快的方式就是 ...

  4. Android六大进程间通信方式总结之一:基本知识

    因为不同进程都是享有独立资源的,所以全局变量这些都是无效的,必须有其他的进程间通信方式. 一.基本知识 1:怎样使用多进程 Android正常使用的多进程的办法只有一种,就是在Service或Acti ...

  5. JavaScript高级 面向对象(5)--最简单的继承方式,混入mix

    说明(2017.3.30): 1. 最简单的继承方式,混入mix <!DOCTYPE html> <html lang="en"> <head> ...

  6. IPC 进程间通信方式——管道

    进程间通信概述 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到. 通知时间: ...

  7. unix进程间通信方式(IPC)

    unix进程间通信方式(IPC) 管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信. 命名管道(named pipe):命名管道克服了管道没有 ...

  8. Linux下进程间通信方式——共享内存

    1.什么是共享内存? 共享内存就是允许两个或多个进程共享一定的存储区.就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针.当一个进程改变了这块地址中的内容的时候,其它进程都会察 ...

  9. 用简单直白的方式讲解A星寻路算法原理

    很多游戏特别是rts,rpg类游戏,都需要用到寻路.寻路算法有深度优先搜索(DFS),广度优先搜索(BFS),A星算法等,而A星算法是一种具备启发性策略的算法,效率是几种算法中最高的,因此也成为游戏中 ...

随机推荐

  1. 新版Notepad++加十六进制查看的插件HexEditor

    Notepad++新版虽然去掉了在线插件商店功能,但是依然可以使用自定义插件 Notepad++下载地址 腾讯(请务必点普通下载):https://pc.qq.com/detail/0/detail_ ...

  2. js 运算的内置函数

    // 一.Math.round()作用:四舍五入返回整数.(返回参数+0.5后,向下取整) // Math.round(5.57) //返回6 // Math.round(2.4) //返回2 // ...

  3. Linux下shell脚本实现mongodb定时自动备份

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功 ...

  4. Java题库——Chapter5 方法

    1)Suppose your method does not return any value, which of the following keywords can be used as a re ...

  5. ubuntu18.04 安装 QQ

    参照大佬文章https://www.lulinux.com/archives/1319 我将安装过程需要的命令行总结出来,便于直接快速安装. # 安装 wine git clone https://g ...

  6. go-爬段子

    爬取搞笑的段子,横向爬取+纵向爬取 横向爬取爬页数,纵向爬取,爬每页的内容 package main import ( "fmt" "io" "net ...

  7. Java - 包装类 常量池

    概述: 在Java中存在一些基本数据类型,这些基本数据类型变量,不能像其他对象一样调用方法,属性.... 一些情况下带来一些问题,包装类就是为了解决这个问题而出现 包装类可以使得这些基础数据类型,拥有 ...

  8. 【JS简洁之道小技巧】第一期 扁平化数组

    介绍两种方法,一是ES6的flat,简单粗暴.二是递归,也不麻烦. flat ES6自带了flat方法,用于使一个嵌套的数组扁平化,默认展开一个嵌套层.flat方法接收一个数字类型参数,参数值即嵌套层 ...

  9. fluwx使用的问题

    今天搞了下fluwx这个库,也是遇到了很多问题. 问题一:‘包名不对,请检查包名是否与开放平台上填写的一致’ 显示把文档这些看了遍,但是也不是很清楚,还加了下群问别人,主要我没有开发过Android, ...

  10. React Native之React Navigation踩坑

    自动重装系统之后,已经很长一段时间没有来写React Native了,今天空闲之余,决定重新配置React Native的开发环境,继续踩坑... React Native的开发环境配置狠简单,只要依 ...