---
lang: ja-jp
breaks: true
---
# `.NET Core`/`.NET Framework` アプリ間のプロセス間通信 2021-10-27
## 目的
`.NET Core`に対応していないライブラリを使用する部分を `.NET Framework`アプリとして実装し、それらアプリ間でプロセス間通信を実施することで順次`.NET Core`に対応していく。
その為、`.NET Core` と `.NET Framework` の両方に対応したシンプルなプロトコルが求められる。
:::info
gRPCに関しては`.NET Framework`が一部のインターフェイスにしか対応していない。また、ローカルホスト内とはいえ、ソケット通信を行う為一部のセキュリティーソフトが警告を発する可能性があるらしい。さらに言うと、gRPCはインターフェイスが使いにくい。。。
> gRPCを廃止したい #107
> https://github.com/malaybaku/VMagicMirror/issues/107
:::
## 概要
`.NET Core`アプリ、`.NET Framework`アプリがそれぞれPipeサーバ/Pipeクライアントとなりお互いに非同期通信を行う。
```plantuml
@startuml
skinparam sequenceArrowThickness 2
skinparam roundcorner 20
actor 利用者
participant ".NET Core\nアプリ" as A
利用者 -> A: アプリ\n起動
activate A
A -> "Pipeサーバ\nスレッド" as A_2 ** : Pipeサーバ\n起動
A --> A: Pipeサーバ\n起動待ち
activate A_2
A_2 --> A_2: Pipe接続\n待ち
A -> "アプリ監視\nスレッド" as A_1 ** : スレッド\n起動
activate A_1
participant ".NET Framework\nアプリ" as B
A_1 -> B: アプリ起動
activate B
A_1 --> A_1: アプリ\n起動待ち
A_1 --> A_1: アプリ\n終了監視
B -> "呼び出し元\nプロセス\n監視スレッド" as B_1 ** : スレッド\n起動
activate B_1
B -> "Pipeサーバ\nスレッド" as B_2 ** : スレッド\n起動
B --> B: Pipeサーバ\n起動待ち
activate B_2
B_2 --> B_2: Pipe接続\n待ち
B_1 --> B_1: 呼び出し元\nプロセス\n終了監視
B --> A_2: 起動完了\n通知
A --> B_2: 処理の実行
A --> B_2: 処理の実行
A --> B_2: 処理の実行
A --> B_2: アプリ終了\n要求
A --> A: アプリ終了\n待ち
B_2 -> B: スレッド\n終了
destroy B_2
B_1 -> B: スレッド\n終了
destroy B_1
B -> A_1: アプリ\n終了
destroy B
A_1 -> A: スレッド\n終了
destroy A_1
A_2 -> A: スレッド\n終了
destroy A_2
利用者 -> A: アプリ\n終了
destroy A
@enduml
```
## 名前付きパイプ System.IO.Pipes
> リモート処理
> https://docs.microsoft.com/ja-jp/dotnet/core/porting/net-framework-tech-unavailable#remoting
> .NET のパイプ操作
> https://docs.microsoft.com/ja-jp/dotnet/standard/io/pipe-operations
###### tags: `.NET Core` `.NET Framework` `プロセス間通信` `System.IO.Pipes` `PlantUML`