2009-09-03 27 views

答えて

8

あなたは、個々のアセンブリをアンロードできません - あなたは全体のAppDomainをアンロードする必要があります。つまり、別のアセンブリ(および関連するコード)を新しいAppDomainにロードする必要があります。アンロードするときは、AppDomainをアンロードします。あなたがのAppDomain間の呼び出しをマーシャリングを心配する必要はありとしてもちろん

が、これは多くの困難の生活になります - しかし、それはすべてのこと、.NETができますです。

+0

これはバックグラウンドワイプです。アプリケーションはタスクマネージャで強制終了するだけで済みます。そのようなアプリを殺した後でも、.dllはアンロードされません。それは私がそれを降ろすために強制したい理由です。 他にどんな方法がありますか? – Anuya

+3

プロセスがなくなった場合は、DLLを保持してはいけません。他のプロセスではないと確信していますか? SysInternalsツールを使用して確認してください。 –

+0

martialling - >マーシャリング? ところで、私は、アプリケーションドメイン間でマーシャリングできるタイプ/インスタンスに制限があると思います。 –

3

ジョンスキートはあなたがDLLをアンロードすることはできませんが、別のAppDomain内のDLLをロードすることができ、書いたように - と、その後のAppDomainをアンロードします。それがそれを行う唯一の方法です。

はあなたが自然のAppDomain間で関数を呼び出す必要がありますので、の異なるする必要がありますがいくつかあります。これは2つの異なる方法で起こります。

1つのAppDomain(Aと呼ぶ)からAppDomain Bでインスタンス化されたオブジェクトへの参照を取得した場合、既定の動作はオブジェクトがAppDomain境界を超えてシリアル化されることです。つまり、Aがアクセスするオブジェクトインスタンスは、Bがアクセスするインスタンスと同じではなく、オブジェクトに戻す機能を提供しない限り、Aで行った変更はBに反映されません。これには、オブジェクトがSerializableでマークされている必要があります。

ただしMarshalByRefObjectからクラスを継承をさせることにより、直列化を回避することができます。オブジェクトがAppDomain Bで構築され、AppDomain Aから呼び出された場合、その呼び出しはAppDomain境界を越えます。それでも同じ物理スレッドなので、クロスプロセスコールやCOMクロスアパートコールのようにスレッドスイッチのオーバーヘッドはありません。

しかし、あなたはA内のオブジェクトによって参照されていますが、B内のオブジェクトは5分間アクセスされないB内のオブジェクトを構築する場合、オブジェクトが配置されます。この動作は、MarshalByRefObject.InitializeLifetimeService()でオーバーライドできます。

関連する問題