50

メインの AppDomain に読み込まれたアセンブリをアンロードする方法を知りたいです。

次のコードがあります。

var assembly = Assembly.LoadFrom( FilePathHere );

完了したら、このアセンブリをアンロードできるようにする必要があります。

ご協力いただきありがとうございます。

4

8 に答える 8

42

.net バージョン コア 3.0 以降の場合:

アセンブリをアンロードできるようになりました。appdomain は .net コアでは使用できなくなったことに注意してください。代わりに、1 つ以上の AssemblyLoadContext を作成し、そのコンテキストを介してアセンブリをロードしてから、そのコンテキストをアンロードできます。AssemblyLoadContextを参照するか、プラグインのロードとアンロードをシミュレートするこのチュートリアルを参照してください。

netframework 4 以前を含む、.net core 3 より前の .net バージョンの場合

アプリ ドメインからアセンブリをアンロードすることはできません。アプリ ドメインを破棄することはできますが、アセンブリがアプリ ドメインに読み込まれると、そのアセンブリはアプリ ドメインの存続​​期間中存在します。

なぜAssembly.UnloadメソッドがないのかについてのJason Zanderの説明を参照してください。

3.5 を使用している場合は、アドイン フレームワークを使用して、さまざまな AppDomains (すべてのアセンブリをアンロードしてアンロードできます) の管理/呼び出しを容易にすることができます。それ以前のバージョンを使用している場合は、自分で新しい appdomain を作成してアンロードする必要があります。

于 2008-09-23T19:51:53.083 に答える
28

これが非常に古いことも知っていますが、この問題を抱えている人を助けるかもしれません! これが私が見つけた1つの方法です!使用する代わりに:

var assembly = Assembly.LoadFrom( FilePathHere );

これを使って:

var assembly = Assembly.Load( File.ReadAllBytes(FilePathHere));

これにより、ファイル自体ではなく、アセンブリ ファイルの「内容」が実際に読み込まれます。これは、アセンブリ ファイルにファイル ロックが設定されていないことを意味します。そのため、アプリケーションを閉じたり、別の AppDomain またはマーシャリングを使用したりすることなく、コピー、削除、またはアップグレードできるようになりました。

長所: 1 ライナーのコードで非常に簡単に修正できます。 短所: AppDomain、Assembly.Location、または Assembly.CodeBase を使用できません。

ここで必要なのは、アセンブリで作成されたインスタンスを破棄することだけです。例えば:

assembly = null;
于 2015-12-03T22:03:17.130 に答える
16

AppDomain 全体をアンロードしないと、アセンブリをアンロードできません。理由は次のとおりです。

  1. そのコードをアプリ ドメインで実行しています。これは、機能し続けることを期待しているアドレスを持つコール サイトとコール スタックが存在する可能性があることを意味します。

  2. アセンブリによって、既に実行中のコードへのすべてのハンドルと参照を追跡できたとします。コードを ngen していないと仮定すると、アセンブリを正常に解放すると、メタデータと IL のみが解放されます。JIT されたコードは、引き続きアプリ ドメイン ローダー ヒープに割り当てられます (JIT されたメソッドは、呼び出された順序でバッファーに順次割り当てられます)。

  3. 最後の問題は、共有されてロードされたコードに関連しています。それ以外の場合、より正式には「ドメイン ニュートラル」として知られています (ngen ツールで /shared を確認してください)。このモードでは、アセンブリのコードが生成され、任意のアプリ ドメインから実行されます (ハード ワイヤードは何もありません)。

アンロードが完全にサポートされているアプリケーション ドメイン境界を自然に囲むようにアプリケーションを設計することをお勧めします。

于 2008-09-23T19:52:34.487 に答える
11

一時アセンブリを別のアセンブリにロードする必要があります。AppDomain使用していないときは、それをアンロードできますAppDomain。安全で速いです。

于 2009-03-20T14:12:22.283 に答える
5

後でアンロードできる一時的なコードが必要な場合は、必要に応じて、DynamicMethodクラスが必要なことを実行する可能性があります。ただし、それではクラスが提供されません。

于 2008-09-23T19:59:38.883 に答える
1

私はそれが古いことを知っていますが、誰かを助けるかもしれません。ストリームからファイルをロードして解放できます。それは私のために働いた。ここで解決策を見つけました。

それが役に立てば幸い。

于 2014-11-28T15:05:36.043 に答える
1

実行時に dll をコンパイルして実行し、すべてのリソースをアンロードする方法の良い例を次に示します: http://www.west-wind.com/presentations/dynamicCode/DynamicCode.htm

于 2009-12-24T14:45:53.100 に答える