0

AfxLoadLibrary を使用してクライアント コンピューターにサード パーティ コンポーネントが存在する場合は、そのコンポーネントを読み込むマネージド C++ コンポーネントを読み込むマネージド Windows アプリケーションがあります。検出されたら、管理対象の親アプリケーションのワーキング セットを下げるために、AfxFreeLibrary を使用してコンポーネントをアンロードします。

AfxFreeLibrary への呼び出しは成功しますが (Process Explorer を使用して確認)、メモリは解放されません。これはマネージド アプリケーションの性質によるものですか? それとも、このプロセス スペースを解放する方法はありますか?

この問題に取り組むための別の方法を一般的に探しているわけではありません。コードは既に運用されているためです。むしろ、アンロードのアプローチが価値があるかどうかを調べたいと思います。

4

1 に答える 1

1

純粋なネイティブ アプリを作成し、ワーキング セットを確認することで証明できます。ただし、ワーキング セットはアプリを実行するために必要なメモリのサイズであるため、dll で使用されるコードをスワップ アウトできる場合、ワーキング セットは減少しません。Windows はそれをワーキング セットの一部としてカウントしません。 .

dll にプロセスに割り当てられたプライベート メモリがあり、それをスワップできない場合、それはカウントされ、ワー​​キング セットが減少します。

したがって、答えは依存するということです。違いが生じることは保証されていません.dllが使用されていない場合、それはスワップアウトされており、現在のワーキングセットの一部ではありません. 物事をきちんとしたいのでない限り、わざわざ荷降ろししない方がいいかもしれません。

ワーキング セットを減らす唯一の方法は、アプリのメモリ使用量を減らすことです。.NET アプリであるため、ほとんど制御できない可能性があります (GC は、ワーキング セットで「アクティブ」で必要なメモリの量を独自に決定するため)。

于 2008-10-17T21:03:19.833 に答える