1

複数のサービス コンポーネントで構成されるCOM+ アプリケーションがあります。

それらの 1 つは、必要に応じて dll から型をインスタンス化します Activator.CreateInstance(pluginType, args);。この型は、サービス対象のコンポーネント自体ではなく、コンポーネントが認識している特定のインターフェイスの実装のみを含んでいます。

インスタンス化自体に問題はありません。問題は、dll が によってロックされているdllhost.exeことです。可能であれば、COM+ アプリケーションをシャットダウンせずに置き換えられるようにしたいと考えています。

COM+ アプリをシャットダウンせずに dll のロックを解除することはできますか?

または別の観点から、プログラムでdllをアンロードしてロックを解除する方法はありますか?

注: dll は、残りの dll と共に COM+ アプリケーションのルート ディレクトリにあります。

4

2 に答える 2

1

これは COM+ に固有の問題ではなく、Windows では普遍的なものであり、その動作の基本的なものです。実行可能ファイル (exe または dll) からのコードの読み込みは、実行可能ファイル用のメモリ マップ ファイルを作成する Windows によって行われます。コードは、ページ フォールトが実際にファイルを読み取ってコードを RAM にマッピングする必要がある場合にのみ、ファイルから読み取られます。これは、他のプロセスが RAM を求めて競合し、コードがマップ解除されると、繰り返し発生します。

MMF は、ファイルをロックします。コードが RAM にマップされている間にファイルを変更できないようにするために必要です。

これに対する回避策はありません。DLL がロードされているプロセスを終了するか、ロックを解除する前に協力して DLL をアンロードする必要がありますせいぜい、使用中にファイルの名前を変更できますが、それ以外の場合はプロセスに影響しません。

于 2012-10-25T09:07:35.833 に答える
1

ロードされたモジュールは、ウィンドウでカウントされて参照されます。Windows には、loadLibrary と freelibrary があります。freelibrary が呼び出され、参照カウントがゼロの場合、dll はアンロードされ、自由に置換、削除などを行うことができます。

ただし、.NET では、アセンブリが appDomain に読み込まれると、appdomain が終了するまで存在します (リフレクションが収集可能なアセンブリを発行しない限り)。別の appdomain を生成し、新しい appdomain が終了したときにここでインスタンスを作成すると、アセンブリがアンロードされます。

Asp.net は、シャドウ キャッシュと呼ばれる機能を実行します。Asp.net では、ワーカー プロセスを強制終了することなく、いつでも dll を置き換えることができます。これは、dll を bin フォルダーにロードするのではなく、別の場所にコピーし、そこから別の appdomain にロードすることによって行われます。bin フォルダーを監視し、変更が発生すると appdomain を強制終了し、dll を一時フォルダーにコピーして、新しい appdomain を作成します。

シャドウ コピー アセンブリ http://msdn.microsoft.com/en-us/library/ms404279.aspx

于 2012-10-25T09:27:25.387 に答える