2012-02-22 8 views
3

C#(または.NETの場合もあります)では、個々のアセンブリをメモリからアンロードできません。 アンロードはAppDomainレベルでのみ可能です。C#で個々のアセンブリをアンロードできない理由は何ですか?

このデザインの背景には何がありますか?他の言語はこの機能をサポートしています(C++だと思います)

+1

古いJason Zanderの記事では、いくつかの初期の理由について説明しています。その理由が変わったのかどうか、またはっきりと問題を解決する必要がないと判断した場合は、http://blogs.msdn.com/ b/jasonz/archive/2004/05/31/145105.aspx –

答えて

4

Here is an MSDN blog post主な問題は次のとおりです。

まず、そのコードをアプリドメイン(duh!)で実行しています。つまり、潜在的にコールサイトと、アドレスを持つコールスタックが動作し続けることを期待していることを意味します。 EIPが0x ????????を指し示すアクセス違反を経験したことがありますか?これは、誰かがDLLを解放し、そのページがメモリシステムによってマップされていない状態になった後、そのページに分岐しようとした例です。これは通常、COMでrefカウントエラーが発生し、インターフェイスメソッド呼び出しを行うときに発生します。マネージドコードを失うことはできません。あなたが実行しているすべてのコードを知っていること、そしてタイプが安全で検証可能であることを保証する必要があります。これは、GCオブジェクトやCOM interopラッパーなど、そのコードを使用している可能性のあるものを明示的に追跡することを意味します。このトラッキングは、今日、アプリのドメイン境界の周りで処理されます。アセンブリレベルでそれを追跡することはかなり高価になる。

私はより高いレベルの言語でこれを要約します:基本的に

、あなたは、単に実行可能コードを削除する場合は間違って行く事が非管理レベルに間違って行きます。もうコンパイルされていないコードを指し示すコードをコンパイルすると、無効な領域にコードがジャンプし、任意のデータが含まれる可能性があります。

これは、管理対象コードでは容認できません。物事は安全であり、その周囲にいくつかの保証があるからです。これらの保証の1つは、コードがメモリの任意のセクションを実行できないことです。

この問題を適切に処理するには、より多くのものをより詳細に追跡する必要があります。これは大きなオーバーヘッドになります。代わりに、appdomainの境界でこれらのものだけを追跡することです。これが行われます。

+0

ありがとうございました。 dllは動的に読み込まれ、jitされます。私はいくつかのDLLが解放されると、シナリオはそのコードに "最初の呼び出し"と同じであると仮定します。多分私は見落としている微妙さがあります。 –

関連する問題