1

その下で実行されているアプリケーションを呼び出すDLLがあります。このDLLは、他のいくつかのアプリケーション/プロセスによって同時にロードされます。したがって、基本的にアーキテクチャは次のとおりです。

ここに画像の説明を入力してください

私の問題は、DLLを使用しているアプリケーションがクラッシュした場合、ベースアプリケーションで終了シーケンスを実行して終了したいということです。このDLLがどのアプリケーションでも使用されなくなったことをどのように検出できますか?DLLのロードカウントのようなもので追跡できるものはありますか?もう1つの問題は、C#アプリケーションを介してこれを監視する必要があるかもしれないということですが、それはさらに重要なことです。

4

3 に答える 3

1

チェックを行うために外部プログラムをシェル化できる場合は、次を使用できます: http ://technet.microsoft.com/en-us/sysinternals/bb896656

于 2012-07-19T07:23:32.470 に答える
1

あなたの画像は、Windowsで実際に起こることの良いモデルではありません。すべてのプロセスは、DLLの独自のコピーを取得します。DLL内のコードはRAMで共有されますが、データは共有されません。データを共有する方法もありますが、それ以外の場合は一般的ではありません。メモリマップトファイルがはるかに一般的なアプローチです。

Windowsは、DLLがプロセスにロードされているかどうかを確認するための安価な方法を提供していません。通知メカニズムもありません。何をするにしても、最初にプロセスから開始する必要があります。これはC#でも機能します。Process.Modulesプロパティを使用できます。

DLLのロードでおそらく十分であることがわかっているプロセスを追跡するだけで、プロセスが実行されなくなったときに、DLLもロードされていないと安全に想定できます。この回答に示されているように、Process.Exitedイベントを使用するか、WMIを使用します。

于 2012-07-19T09:26:56.120 に答える
0

基本アプリケーションでDLLをホストし、共有セクションを使用して独自の参照カウントを実装することもできます。簡単で、頻繁に使用されます。すでに述べたように、1つの可能性は、DLLエントリポイント内にrefカウントを実装し、仕様に従ってDLL_PROCESS_DETACH、DLL_THREAD_DETACH、DLL_PROCESS_DETACHなどを検出することです。

于 2012-08-10T05:57:40.417 に答える