Windows サービス (.NET C#) にタイマーがあります。外部プログラムから経過値を変更できるようにする必要があります。タイマーが現在実行中の場合、外部プログラムから経過時間の値を短縮できるようにする必要があります。タイマーの経過値を変更してタイマーを再起動するパブリック メソッドをサービスに用意することを考えていましたが、Windows サービスで外部プログラムからパブリック メソッドを呼び出すことはできますか?
4 に答える
つまり、別のプロセスで関数を直接呼び出すことはできません。アクセスする機能を含むプロセス (この場合は Windows サービス) は、ある種の IPC (プロセス間通信) を介してそれを公開する必要があります。どのタイプの IPC を選択するかは、必要な通信の複雑さと、「クライアント」が .NET アプリケーションであるかどうかによって異なります。
ニーズが単純な場合 (タイマー値の設定など)、またはクライアントが .NET を使用していない場合は、名前付きパイプ (別の物理マシンからサービスにアクセスする必要がある場合は TCP) を使用するのがおそらく最善の策です。名前付きパイプと TCP はどちらも、メッセージを書き込んだり、相手側で読み取ったりできる Stream を提供します。
多くの異なる関数を公開したり、複雑なデータ型を送受信したりする必要があり、両方で .NET を使用している場合は、おそらく .NET Remoting または WCF が最適です。.NET Remoting はより単純ですが、より多くの制約があります。WCF は非常に柔軟ですが、学習曲線は急勾配です。
はい、これは可能です。
サービス上にNetNamedPipeエンドポイントを作成し、そのインターフェイスを介してサービスを制御することを検討することをお勧めします。
NetNamedPipeBinding binding = new NetNamedPipeBinding();
MyService myService = new MyService(binding,
new EndpointAddress("net.pipe://localhost/MyService"));
myService.ResetTimer(30);
Windows サービス プロセス内のメソッドを直接呼び出すことはできませんが、たとえば、Windows サービスでこの関数を WCF サービスとして公開することはできます。Windows サービスは、サービス ホストとしても機能します。それは可能であり、複雑ではありません。
古い(WCF以外の)サービスは.NETRemotingを使用できます。開始方法に関する情報については、こちらをご覧ください。これは、プロセスの境界を越えてアプリケーション間で通信するWCF以前の方法です。