C# 簡單的進程間通訊方式

只想實現一個簡單的進程建通訊,有什麼快速實現方式?html

1 進程單例需求 / Windows 消息與 IMessageFilter

若是需求是實現一個進程單例,在啓動第二個進程時,指望能自動喚起第一個進程的窗口。
能夠參見:
C#/WPF 僅啓動一個進程實例 - J.曬太陽的貓 - 博客園c#

但有個問題,若是實現了最小化到托盤(WPF/.net core WPF 系統托盤支持)這個功能,則這個喚醒將會失效。
緣由:窗口隱藏以後,將不會接收到 windows 消息。詳情和怎麼解,能夠看: C#向無窗口的進程發送消息_C#教程_腳本之家
但這個實現依賴於 WinForm,在 WPF 下是不生效的。(Message Filters in WPF ?windows

因此,若是是 WinForm 程序,能夠經過 IMessageFilter 實現簡單的進程間通訊,發個指令仍是 OK 的。api

2 WPF 程序

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

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 使用示例:code

// 待續orm

c# - Example of Named Pipes - Stack Overflow


原文連接:
C# 簡單的進程間通訊方式 - J.曬太陽的貓 - 博客園

相關文章
相關標籤/搜索