2011-06-24 17 views
6

WindowsサービスでホストされているWCFサービスがあります。ホスト(.exe)とサービスライブラリ(.dll)の2つのアセンブリがあります。サービスライブラリが更新されると、ライブラリを置き換えるためにサービスを停止する必要があります。サービスを再開せずにライブラリを置き換えるような、IISと同様の機能を持っていたいと思います。 それは可能でしょうか?サービスを再起動せずにWCFサービスライブラリを置き換えます。

答えて

4

IISはこれを達成するためにシャドウコピーと呼ばれるものを使用します。あなたはあなたのサービスホストに似た何かを実装することができます。基本的には、サービスを開始する前に.DLLを別の場所にコピーし、そのコピーからホストにサービスクラスをロードさせることが考えられます。次に、ホストは、元のファイルへの変更をリスンするファイルシステムモニタを設定します。 1つを検出すると、サービスを停止し、新しいファイルをコピーして再起動します。

EDIT

(1)特定のタイプライブラリ内のクラスを使用してのServiceHostを開始するには、リフレクションを使用する必要があると思います。次のようなものがあります。

Assembly myAssembly = Assembly.LoadFile(path); 

Type serviceType = myAssembly.GetType(className); 

ServiceHost serviceHost = new ServiceHost(serviceType); 

LoadFileが依存関係をどのように解決するかは不明です。この作業を行うには、Assembly.ModuleResolveイベントをフックする必要があります。

(2)ファイルシステムのモニターには若干のオーバーヘッドが発生しますが、私の経験では最小限です。いずれにしても、更新されたDLLのインストーラを使用しない限り、これは本当に唯一のオプションです。

(3)ファイルがロックされている理由がわかりません。自分で解決する必要があります。

+0

anser Peterありがとうございます。ちょうどホストの再起動を意味するものを理解したいと思いますが、とにかくWindowsサービスを再起動する必要がありますか? – NDeveloper

+0

いいえ。Windowsサービスアプリケーションは再起動しません。 「再起動」とは、サービスをホストしているServiceHostオブジェクトを閉じ、新しいDLLをコピーした後、新しいServiceHostオブジェクトを作成して開始することを意味します。 –

+0

そのようなサービスがたくさんあるのは問題ではないでしょうか。私は、ファイルワッチャーがたくさんあるため、システムのパフォーマンスに影響しないのでしょうか?また、正確なディレクトリからアセンブリを読み込むようにServiceHostに指示する方法もあります。 – NDeveloper

2

Peterには1つの提案があります。サイズや保証の可否によっては、インフラストラクチャを少なくとも2台のクラスタ化されたサーバーに移動することもできます。これにより、一度に1つずつ更新できますが、他の1つは要求を引き続き受け取ります。あなたが正しくバージョンを変えれば(契約の変更==新しいメソッド)、この方法はうまく動作します。古いクライアントは新しいビットに関係なく同じデータを引き続き取得します。

+0

クラスタ化されたサーバーは実用的なソリューションになる可能性がありますが、停止があるかどうかにかかわらず、サービスの再起動なしにlibを置き換えることに興味があります。 – NDeveloper

関連する問題