(WCF)技術系TweetモチベーションC#でプロセス間通信をしたので、備忘録代わりに残しておきます。(WPF)を使って簡単なソフトウェアを作ることはよくあります。UIスレッドのみで完結し、たまにマルチスレッドにするくらいで、マルチプロセスにすることなんて滅多にありません。最近とあるDLL内の関数を同一のプロセスから叩くと、なぜか正常に機能しないということがありました。仕方なくマルチプロセスにした、という次第です。普段はmacを使っていて、WPFも完全には理解できていないので、変なところがあるかもしれませんが、コメントなりPRなり頂けると幸いです。(WCF)今回はWCFというものを使ってプロセス間通信を行います。WCFとはなにか、については↓www.atmarkit.co.jp今回はこのWCFを使って、クライアントアプリからホストアプリ2つを呼び出す、という感じのものを作ります。wcf_sample今回作ったwcf_sampleについて軽く説明します。wcfの3つから成ります。Frameworkのクラスライブラリです。クライアントアプリwcf_sampleからホストアプリhostを呼び出すという感じの構成です。hostはwcfを参照しています。WCFで通信を行うためには、System.ServiceModelのアセンブリを参照する必要があるので、wcfはSystem.ServiceModelを参照します。実装するのは、以下の2つの内容です。ホストアプリに入力された内容を、クライアントアプリから取得するクライアントアプリの内容を、ホストアプリに反映させるこんな感じで動きます。https://www.youtube.com/watch?v=IELotyjpYF4wcf_samplewcfwcfではWCFに関連する処理をカプセル化しています。含まれるのは、以下のwcf.csのみです。Dataを定義しています。IHostとICallbackでどのような形式で通信を行うかを定義します。この2つは別のソースファイルでも、名前空間が異なっていても構わないので、同一の内容である必要があります。今回はwcfにまとめてしまっていますが、ホストアプリではIHostを実装したクラス(ここではHost)に実際に呼ばれたときの挙動を実装し、クライアントアプリではICallbackを実装したクラス(ここではCallback)にホストアプリからの応答を実装します。今回の場合、クライアントアプリからIHost#LoadDataを叩くと、ホストアプリでHost#LoadDataが呼ばれ、その中でICallback#SendDataを叩くと、クライアントアプリのCallback#SendDataが呼ばれる、という流れです。ホストアプリはホスティングをするためにServiceHost#openをする必要があります。ここでは、Host.StartHostに記述しています。イメージとしてはサーバーを起動するような感じです。クライアントアプリはホストに接続しに行きます。Callback.ConnectHostに記述しています。今回のように双方向で通信を行う場合はDuplexChannelFactoryでIHostを取得します。この取得したIHostを使って、ホストアプリにリクエストを送るような感じになります。WCFで接続をする際には、ホストとクライアントで共通でユニークなアドレスを指定する必要があります。"net.pipe://localhost/wcf_sample"にidを付与したものをアドレスとして指定しています。このlocalhostにLAN内のIPを指定したら他のマシンのプロセスと通信できるんでしょうか?そのうち試してみたいと思います。hostwcf_sampleとhostはそれぞれ以下のような画面です。wcf_sampleでReloadボタンを押すと、WCF経由でhostのTextとNumberのTexBoxに入れた内容が取得されます。wcf_sampleのSliderを動かすと、その値がWCF経由でhostに送られ、hostのSliderに反映されます。クライアント側(wcf_sample)の主要な実装です。hosts[0].UpdateSlider(H1Slider.Value);}wcf_sampleが起動されたときに、hostを2つ起動します。(多分パスの指定はもっといい方法があると思います)このとき、コマンドライン引数でidを渡します。hostが起動したら、接続して、返ってきたIHostを保持しておきます。Reloadボタンが押されると、IHost#LoadDataが、Sliderの値が変更されるとIHost#UpdateSliderが叩かれます。次にホスト側(host)の実装です。val));}ホストアプリが起動されると、Host.StartHostでホスティングを開始します。クライアントアプリからIHost#LoadDataが呼ばれると、delegeteを経由して上記のLoadDataが呼ばれます。ここで、TextBoxの内容を取得して、callbackによってクライアントに返ります。1点注意すべきことは、WCF経由で呼ばれる処理はUIスレッドでは無いので、TextBoxなどのUIコンポーネントを普通に呼ぶとエラーが起きます。Dispatcher.Invokeを使いましょう。runhostをビルドしていないと、Process.Startができないので、まずhostをビルドしましょう。その後、wcf_sampleを実行すれば動くはずです。デバッグをする場合wcf_sampleを実行すると、hostのデバッグがやりにくいですが、「デバッグ>プロセスにアタッチ」からプロセスにアタッチすると、ホストアプリでもブレークポイントを張ったりできます。ホストアプリのほうでエラーが起きて、正常にCallbackに処理が返らないと、クライアント側でCommunicationObjectFaultedExceptionが出ます。WCFの処理の途中でエラーが起きてもUIが固まったりしない(非UIスレッドなので)ので、わかりにくいですが、そういうときは、プロセスにアタッチすると良いでしょう。(1)はてなブログをはじめよう!hayashikunsanさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。