時々私が小さなプロジェクトをしているとき、私は十分に注意を払わず、知らないDLLの依存関係を誤って追加します。このプログラムを友人や他の人に出荷すると、「一部のDLL」が見つからないため「機能しません」。これは、プログラムがシステム上でDLLを見つけることができますが、システムでは見つけることができないためです。
これらのoops状況を防ぐために、DLL依存関係の実行可能ファイルをスキャンするか、テストのために「クリーンな」DLLフリー環境でプログラムを実行する方法はありますか?
依存関係ウォーカーを試してください: http://www.dependencywalker.com/
Visual Studioツール(VC\binフォルダー)のdumpbin
がここで役立ちます。
dumpbin /dependents your_dll_file.dll
Linuxファンには興味深いソリューションをお勧めします。このソリューションを検討した後、DependencyWalkerからこれに切り替えました。
Windows関連のldd
、exe
でお気に入りの dll
を使用できます。
これを行うには、Windowsに Cygwin (追加パッケージを必要としない基本インストール)をインストールし、Cygwin Terminal
を起動するだけです。これで、次のようなお気に入りのLinuxコマンドを実行できます。
$ ldd your_dll_file.dll
UPD:ldd
は、 Windowsのgit bash端末 でも使用できます。 gitが既にインストールされている場合に備えて、cygwinをインストールする必要はありません。
最も安全なのは、プログラムをテストできるクリーンな仮想マシンがあることです。テストするすべてのバージョンで、VMを初期のクリーンな値に復元します。次に、セットアップを使用してプログラムをインストールし、機能するかどうかを確認します。
DLLの問題にはさまざまな面があります。 Visual Studioを使用してCRTに動的にリンクする場合、CRT DLLを配布する必要があります。 VSを更新すると、CRTの別のバージョンを配布する必要があります。依存関係をチェックするだけでは十分ではありません。クリーンなマシンでフルインストールを実行することが唯一の安全なソリューションであるIMOです。
本格的なテスト環境をセットアップせずにWindows 7を使用する場合は、XP-Modeを初期クリーンマシンとして使用し、 XP-More を使用してVMを複製できます。
開発マシンで、プログラムを実行して Sysinternals Process Explorer を実行できます。下のペインに、ロードされたDLLとそれらへの現在のパスが表示されますが、これはいくつかの理由で便利です。展開パッケージを実行している場合、どのDLLが間違ったパスで参照されているかが明らかになります(つまり、正しくパッケージ化されていません)。
現在、当社はVisual Studio Installerプロジェクトを使用して、依存関係ツリーをたどり、ルーズファイルとしてプログラムを出力しています。 VS2013では、これは拡張機能になりました: https://visualstudiogallery.msdn.Microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d 。その後、これらの緩やかなファイルをより包括的なインストーラーにパッケージ化しますが、少なくともそのセットアッププロジェクトはすべてのドットネット依存関係を1つの場所にドロップし、不足している場合は警告します。
過去(つまりWinXPの日々)、DLL Dependency Walker(depends.exe)に依存/依存していましたが、DLLを特定できない場合があります問題。理想的には、実行前に検査で調べたいのですが、それで解決しない場合(または時間がかかりすぎる場合)は、 http:// blogs。 msdn.com/b/junfeng/archive/2006/11/20/debugging-loadlibrary-failures.aspx および https://msdn.Microsoft.com/en-us/library/windows/hardware /ff556886(v=vs.85).aspx と簡単に言及しました LoadLibraryが失敗しました; GetLastErrorヘルプなし
警告:過去にWindowsを台無しにして、gflagをひざまづかせてクロールしました。
注:「ローダースナップ」はプロセスごとであるため、UIの有効化はチェックされたままになりません(cdbまたはglfags -iを使用)
グーグルで「depends.exe」を検索してください。これを処理する小さなユーティリティです。
NDependはJesseによって既に言及されています(.NETコードを分析する場合)が、それがどのように役立つかを正確に説明しましょう。
DLL依存関係の実行可能ファイルをスキャンしたり、これらのoops状況を防ぐためのテストのために「クリーンな」DLLフリー環境でプログラムを実行できるプログラム/スクリプトはありますか?
[NDependプロジェクトプロパティ]パネルでは、分析するアプリケーションアセンブリ(緑色)とNDependはアプリケーションによって使用されるサードパーティアセンブリを推測します(青色)を定義できます。アプリケーションおよびサードパーティのアセンブリを検索するディレクトリのリストが提供されます。
これらのディレクトリにサードパーティのアセンブリが見つからない場合、エラーモードになります。たとえば、.NET FxディレクトリC:\WINDOWS\Microsoft.NET\Framework\v4.0.30319
を削除すると、.NET Fxサードパーティアセンブリが解決されないことがわかります。
免責事項:私はNDependで働いています
ソースコードがある場合は、ndependを使用できます。
それは高価であり、依存関係を分析する以上のことを行うため、探しているものをやり過ぎかもしれません。
JetBrains dotPeek を試してください。それは無料です。
以下のリンクからMicrosoftのSysInternalツールキットを参照してください https://docs.Microsoft.com/en-us/sysinternals/downloads/process-Explorer
ダウンロードフォルダに移動し、管理者権限で「Procexp64.exe」を開きます。 [検索]メニュー-> [ハンドルまたはDLLの検索]オプションまたはCtrl + Fショートカットを開きます。