只想實現一個簡單的進程建通信,有什么快速實現方式?
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通信的庫
