2

リフレクションを使用して、wcfで拡張可能なプロジェクトを作成しました。Webサービスは、入力要求に応じて、実行時にさまざまなモジュールをロードします。モジュールライブラリを動的にロードするために.NETリフレクションを使用します。システムはIISで実行されます。

テスト中に、Reflectionを介してロードされた既存のdllを置き換えることができないことに気付きました。新しいdllをbinディレクトリにコピーしようとしましたが、「アプリケーションで使用されているdll」と同様のエラーが発生しました。システムでのみそのdllを使用していることを確認できます。ただし、dllを置き換えると、IISが停止する可能性があります。ただし、IISを停止せずにdllを置き換える必要があります。とにかくこれをコードレベルで処理できますか?

迅速な対応に感謝します。

IOrder orderImpl = null;

try
{

string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\" + assemInfo.AssemblyQualifiedName + ".dll";
path = path.Replace("file:\\", "");
Assembly a = Assembly.LoadFile(path);

Type commandType = a.GetType(assemInfo.AssemblyQualifiedName + "." + assemInfo.ClassName);

orderImpl = (IOrder)commandType.GetConstructor(new System.Type[] { typeof(LocalOrderRequest) }).Invoke(new object[] { order });

}
catch (Exception ex)
{
throw new OrderImplException("-1", ex.Message);
}

ありがとうRSF

4

2 に答える 2

0

独自のAppDomainを作成して、そこからアセンブリをロード/アンロードしてみてください。これに関する記事は次のとおりです。http://people.oregonstate.edu/~reeset/blog/archives/466

于 2012-09-14T12:06:00.567 に答える
0

私はあなたの質問から2つの仮定をするつもりです:1)稼働時間はあなたのアプリにとって重要であり、それがそれを更新するために30秒間シャットダウンすることができない理由です。2)フォールトトレラントで負荷分散されたファームにはありません。

その場合、#2を解決すると、ダウンタイムなしでDLLを更新する方法も解決されます。

DLLを更新するために数秒間シャットダウンできないアプリの場合、必要な安定性をサポートするインフラストラクチャが必要です。予期しない停止のリスクは、アプリの更新による影響よりもはるかに大きくなります。

サーバーの1つがダウンした場合にフォールトトレラントルーティングを提供するロードバランサーの背後に複数のサーバーが必要です。

これにより、障害によるダウンタイムのリスクを最小限に抑え、1つのノードでIISをシャットダウンして更新し、再起動することでDLLを更新できます。負荷分散は、ノードがダウンしていることを認識し、更新されたノードが再び使用可能になるまで、トラフィックを適切なノードにルーティングします。他のノードで繰り返し、ダウンタイムなしでアプリを更新しました。

于 2012-09-14T12:07:32.997 に答える