メインの AppDomain に読み込まれたアセンブリをアンロードする方法を知りたいです。
次のコードがあります。
var assembly = Assembly.LoadFrom( FilePathHere );
完了したら、このアセンブリをアンロードできるようにする必要があります。
ご協力いただきありがとうございます。
.net バージョン コア 3.0 以降の場合:
アセンブリをアンロードできるようになりました。appdomain は .net コアでは使用できなくなったことに注意してください。代わりに、1 つ以上の AssemblyLoadContext を作成し、そのコンテキストを介してアセンブリをロードしてから、そのコンテキストをアンロードできます。AssemblyLoadContextを参照するか、プラグインのロードとアンロードをシミュレートするこのチュートリアルを参照してください。
netframework 4 以前を含む、.net core 3 より前の .net バージョンの場合
アプリ ドメインからアセンブリをアンロードすることはできません。アプリ ドメインを破棄することはできますが、アセンブリがアプリ ドメインに読み込まれると、そのアセンブリはアプリ ドメインの存続期間中存在します。
なぜAssembly.UnloadメソッドがないのかについてのJason Zanderの説明を参照してください。
3.5 を使用している場合は、アドイン フレームワークを使用して、さまざまな AppDomains (すべてのアセンブリをアンロードしてアンロードできます) の管理/呼び出しを容易にすることができます。それ以前のバージョンを使用している場合は、自分で新しい appdomain を作成してアンロードする必要があります。
これが非常に古いことも知っていますが、この問題を抱えている人を助けるかもしれません! これが私が見つけた1つの方法です!使用する代わりに:
var assembly = Assembly.LoadFrom( FilePathHere );
これを使って:
var assembly = Assembly.Load( File.ReadAllBytes(FilePathHere));
これにより、ファイル自体ではなく、アセンブリ ファイルの「内容」が実際に読み込まれます。これは、アセンブリ ファイルにファイル ロックが設定されていないことを意味します。そのため、アプリケーションを閉じたり、別の AppDomain またはマーシャリングを使用したりすることなく、コピー、削除、またはアップグレードできるようになりました。
長所: 1 ライナーのコードで非常に簡単に修正できます。 短所: AppDomain、Assembly.Location、または Assembly.CodeBase を使用できません。
ここで必要なのは、アセンブリで作成されたインスタンスを破棄することだけです。例えば:
assembly = null;
AppDomain 全体をアンロードしないと、アセンブリをアンロードできません。理由は次のとおりです。
そのコードをアプリ ドメインで実行しています。これは、機能し続けることを期待しているアドレスを持つコール サイトとコール スタックが存在する可能性があることを意味します。
アセンブリによって、既に実行中のコードへのすべてのハンドルと参照を追跡できたとします。コードを ngen していないと仮定すると、アセンブリを正常に解放すると、メタデータと IL のみが解放されます。JIT されたコードは、引き続きアプリ ドメイン ローダー ヒープに割り当てられます (JIT されたメソッドは、呼び出された順序でバッファーに順次割り当てられます)。
最後の問題は、共有されてロードされたコードに関連しています。それ以外の場合、より正式には「ドメイン ニュートラル」として知られています (ngen ツールで /shared を確認してください)。このモードでは、アセンブリのコードが生成され、任意のアプリ ドメインから実行されます (ハード ワイヤードは何もありません)。
アンロードが完全にサポートされているアプリケーション ドメイン境界を自然に囲むようにアプリケーションを設計することをお勧めします。
一時アセンブリを別のアセンブリにロードする必要があります。AppDomain
使用していないときは、それをアンロードできますAppDomain
。安全で速いです。
後でアンロードできる一時的なコードが必要な場合は、必要に応じて、DynamicMethod
クラスが必要なことを実行する可能性があります。ただし、それではクラスが提供されません。
私はそれが古いことを知っていますが、誰かを助けるかもしれません。ストリームからファイルをロードして解放できます。それは私のために働いた。ここで解決策を見つけました。
それが役に立てば幸い。
実行時に dll をコンパイルして実行し、すべてのリソースをアンロードする方法の良い例を次に示します: http://www.west-wind.com/presentations/dynamicCode/DynamicCode.htm