6

アセンブリをロードしてからアンロードするために、AppDomain を使用しています。

しかし、私は非常に難しい問題を抱えています。AppDomain がアンロードされた後、一部のアセンブリが複数回ロードされていることをプロセス エクスプローラーで確認できます。読み込まれたアセンブリが残っているのはなぜですか? AppDomain.Unload は、AppDomain のロード済みメモリをすべて解放しませんか?

添付の画像で確認できます。

合計 AppDomains は 3 です (プロセスのライフサイクルで 3 つの AppDomains を作成しました)

AppDomains: 1 (現在、AppDomain は 1 つだけ存在します)

そして何らかの理由で、次のロードされた DLL セクションでわかるように、アセンブリはプロセスに複数回ロードされます..

コード:

AppDomain fetcherDomain = AppDomain.CreateDomain("StatusFetcher");
try
{
    var fetcher = (LocalStatusFetcher)fetcherDomain.CreateInstanceFromAndUnwrap(Assembly.GetExecutingAssembly().CodeBase, typeof(LocalStatusFetcher).FullName);
    //doing some other stuff that is not interesting...
}
finally
{
    AppDomain.Unload(fetcherDomain);
}

はい、LocalStatusFetcher は MarshalByRefObject を継承しています...

ここに画像の説明を入力

4

1 に答える 1

2

外部アプリケーション ドメインに読み込んでいるアセンブリが、現在のアプリケーション ドメインに取り込まれている可能性が非常に高いです。これが発生する可能性のある方法はたくさんありますが、特に問題はメソッドに渡さAssembly.GetExecutingAssembly().CodeBaseCreateInstanceFromAndUnwrapます。を呼び出すとAssembly.GetExecutingAssembly()、現在実行中のアセンブリが現在のアプリ ドメインに読み込まれ、 に.CodeBaseプロパティが 渡さCreateInstanceFromAndUnwrapれると、ターゲット プロキシをインスタンス化する前に、(アプリケーション パスまたは GAC にある) ターゲット アセンブリをターゲット ドメインに読み込もうとします。現在、出血の問題の可能性を除けば、このコードに問題はありません。

複数のアプリケーション ドメインがある場合、AppDomain 間で共有される唯一のアセンブリは mscorlib.dll であるため、LoadFrom コンテキストにアセンブリの複数のコピーが表示されます。私があなたの質問を誤解していない限り、あなたが見ているものは正常だと思います.

于 2012-11-26T01:50:22.260 に答える