私が達成しようとしているものの簡略化されたバージョン:
- バックグラウンドで非表示 (Visible = false) で実行される WinForms アプリがあります。
- フォームは 1 つしかなく、デフォルト名の Form1 のままにしました。
- この WinForms アプリは、WCF サービスをホストします。ここでは、これを Listener サービスと呼びます。
- このリスナー サービスには、サービス関数として公開されている「DisplayAlert()」という関数があります。
- 別のマシンにあるアプリは、標準の WCF サービス呼び出しを介してリスナー サービスにメッセージを送信します。
上記のすべてがうまく機能しています。コードをステップ実行して、DisplayAlert() 関数が呼び出されるときのメッセージの流れを確認できます。
私が理解できないこと、そしてこの単純なことを行う方法を見つけるのがとても難しいとは信じられません:
- ホストされたサービスの DisplayAlert() 関数が、それをホストしている WinForm と直接対話して、フォームを表示できるようにしたいと考えています。
やりたいことは、Visibility を true に設定し、WinForm で別の関数を呼び出すことだけです。
これは、フォームへの参照を追加するか、フォームにパブリック関数を作成してサービスクラスから呼び出すのと同じくらい簡単であるように思えますが、サービス内から Form1 を参照する方法さえわかりませんクラス。
明らかな何かが欠けていますか?サービスをホストしている Form1 のインスタンスを参照するにはどうすればよいでしょうか?
……という道をたどりました。
- ListenerService (AlertReceived、仮想 void OnAlertReceived) でイベントを作成し、フォームにイベント ハンドラーを追加できると考えました。
- サイコロはありません。ListenerService クラスを直接インスタンス化するのではなく、ServiceHost で実行しています。
- Application.Form1 として参照できると考えて、クラス内から Application オブジェクトを参照しようとしていますが、違います。サービス クラス内から Application オブジェクトを確認することさえできません。
- ここで明らかな何かが欠けている可能性がありますが、よくわかりません。
他の提案はありますか?
役立つ場合は、コードを追加できます。