只想實現一個簡單的進程建通訊,有什麼快速實現方式?html
若是需求是實現一個進程單例,在啓動第二個進程時,指望能自動喚起第一個進程的窗口。
能夠參見:
C#/WPF 僅啓動一個進程實例 - J.曬太陽的貓 - 博客園c#
但有個問題,若是實現了最小化到托盤(WPF/.net core WPF 系統托盤支持)這個功能,則這個喚醒將會失效。
緣由:窗口隱藏以後,將不會接收到 windows 消息。詳情和怎麼解,能夠看: C#向無窗口的進程發送消息_C#教程_腳本之家
但這個實現依賴於 WinForm,在 WPF 下是不生效的。(Message Filters in WPF ?)windows
因此,若是是 WinForm 程序,能夠經過 IMessageFilter
實現簡單的進程間通訊,發個指令仍是 OK 的。api
WPF 能夠使用遠程代理實現。
RemotingServices 類 (System.Runtime.Remoting) | Microsoft Docside
簡單的實現以下:spa
// 服務端能夠被代理調用的類 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 端口號和路由地址,就能夠實現調用。.net
.net core 已經不在提供 Remoting 的支持,.NET Framework technologies unavailable on .NET Core - .NET Core | Microsoft Docs
因此,得另想辦法,微軟官方推薦的就是 Pipe . System.IO.Pipes Namespace | Microsoft Docs
在 .net framework 下也能夠用。代理
Pipe 使用示例:code
// 待續orm
c# - Example of Named Pipes - Stack Overflow