2009-12-08 8 views
6

私はWindowsサービス(.NET C#)にタイマーを持っています。私は、外部プログラムから経過値を変更できる必要があります。タイマーが現在実行中の場合は、外部プログラムからの経過時間を短縮できる必要があります。私は、タイマーの経過値を変更し、タイマーを再起動するサービスのパブリックメソッドを考えていたが、外部プログラムは、Windowsサービス上のパブリックメソッドを呼び出すことができますか?Windowsサービスでパブリックメソッドを呼び出す

答えて

8

つまり、別のプロセスで関数を直接呼び出すことはできません。アクセスする機能(この場合はWindowsサービス)を含むプロセスは、何らかの種類のIPC(プロセス間通信)を介して公開する必要があります。どのタイプのIPCを選択するかは、コミュニケーションの複雑さと、「クライアント」が.NETアプリケーションかどうかにかかっています。

あなたのニーズが単純な場合(タイマー値を設定するなど)、クライアントが.NETを使用しない場合は、名前付きパイプ(TCP)を使用して別の物理マシンからサービスにアクセスする必要があります。最善の策。名前付きパイプとTCPの両方を使用すると、メッセージを書き込んで相手先で読むことができるストリームが得られます。

多くの異なる機能を公開したり、複雑なデータ型を送受信する必要があり、両端で.NETを使用している場合は、おそらく.NET RemotingまたはWCFが最適です。 .NET Remotingは簡単ですが、より多くの制約があります。 WCFは非常に柔軟ですが、学習曲線は急峻です。

+1

.NET Remotingは従来のテクノロジとみなされ、新しい開発には推奨されていません(http://msdn.microsoft.com/en-us/library/72x4h507%28VS.85%)。 29.aspx)。これを行うには、Windows Communication Foundation(WCF)が承認された方法です。 WCFに精通していない場合は、このビデオ(http://www.dnrtv.com/default.aspx?showNum=135)を参照して、この技術の概要を確認してください。 –

4

Windowsサービスプロセスで直接メソッドを呼び出すことはできませんが、Windowsサービスでこの関数をWCFサービスとして公開することができます。 Windowsサービスはサービスホストとしても機能します。それは可能で複雑ではありません。

5

はいこれが可能です。

サービス上にNetNamedPipeエンドポイントを作成し、そのインターフェイスでサービスを制御することを検討してください。

NetNamedPipeBinding binding = new NetNamedPipeBinding(); 
MyService myService = new MyService(binding, 
       new EndpointAddress("net.pipe://localhost/MyService")); 
myService.ResetTimer(30); 
+0

MyServiceは2つの組織を使用していません。 –

2

古い(非WCF)サービスでは.NET Remotingを使用できます。開始方法に関する情報については、hereをご覧ください。これは、プロセス境界を越えてアプリケーション間で通信するWCF以前の方法です。

関連する問題