2

DLL の新しいコピーをリモート サーバー上の GAC に展開しようとしていますが、現在実行中のプロセスに、置き換える DLL のコピーが読み込まれているかどうかを確認する必要があります。少なくともユーザーに伝えてください。

たとえば、Biztalk は、必要な DLL を最初に使用するときにロードするように見えます。その後、それらを置き換えると、ホスト インスタンスが再起動されるまで古いコピーがメモリに保持されます。これは、デプロイの一部として簡単に実行できます。

.NET を使用して、どのプロセスが GAC から特定の DLL をロードしたかを知る方法はありますか?

アップデート:

さらに調査すると、Process Explorer にはこの機能があり、別の Sysinternals ツールであるListDLLは、私がやりたいことを正確に実行することがわかりました。ListDLL をインクルードしてスクリーンスクレイピングする必要なく (ライセンス内で許可されている場合でも)、この機能をアプリケーションに複製したいので、彼らがどのようにそれを行うのか知りたいです。

4

2 に答える 2

2

この作品のようなものでしょうか:

Process[] proc = Process.GetProcesses("<optional machine name>");
ProcessModuleCollection mods = proc[0].Modules;

modsコレクションには、現在のプロセス用にロードされたすべてのモジュールが含まれます。procコレクションを簡単に繰り返し、次にmodコレクションを繰り返して、対象のモジュールがロードされているかどうかを確認できます。ロードされている場合は、プロセスを強制終了できます。

于 2009-11-20T14:55:24.437 に答える
0

これをプログラムまたは手動で行う必要がありますか?

Process Explorerのハンドル/DLL 検索機能を使用して、使用中のモジュールを手動で見つけることができます。

リンクテキスト

アップデート:

いいえ、Win32 および NT API のほこりだらけのコーナーからのものを広範に使用する以外に、これがどのように機能するのかわかりません。

参照できるオープンソースの代替手段がいくつかあります。

もう 1 つのユーティリティであるPSListは、リモート マシン上のプロセスを一覧表示します。そのページには、コントロール パネル/管理ツール/パフォーマンス MMC を駆動するのと同じものである Windows パフォーマンス カウンターを使用して表示することが記載されています。.NET からこれらのカウンターにアクセスできることは知っていますが、ロードされたモジュールやプロセスに関するその他の詳細を取得できるかどうかはわかりません。

MSDN のドキュメントでは、Process.GetProcessesパフォーマンス カウンターを使用していると書かれているため、おそらくそれが適切な方法です。それを機能させる方法を理解する必要があるだけです。同じことを手動で行った場合にも、問題が発生します。Win95/98/ME マシンからこれを行う必要はありませんか?

WNetAddConnectionクエリを実行する前に、リモート マシンで自分自身を認証するなどの操作が必要になる場合があります。ただし、.net に相当するものが何であるかはわかりません。

最悪のケースは、サーバー上でローカルに実行され、ソケットなどを介して結果を返すアプリを作成することです。

于 2009-11-19T23:09:47.610 に答える