Dependency Walker

今日は実行ファイルを他人に送付して動かしてもらおうとしていろいろと苦労してしまいました。どうも最近のVisual Studioでビルドしたプログラムは、DLL関連のバージョン間競合の問題を回避するための様々な新技術が適用されていて、きちんと理解していないと正しく動かすために必要なファイルを特定することができなくて大変ですね。
ということで、今日はDependency Walkerというツールを使ってしまいました。Visual Studioにも付属してくるツールなのですが、実はフリーウェアとして配布されているもののようです。このウィンドウに実行ファイルをドラッグアンドドロップしてやると、その実行ファイルが実行時にロードするDLLをリストアップして教えてくれます。もっともこれは対象DLLが固定されているものだけでしょうね。LoadLibrary API関数を使うと、ファイル名を指定してDLLを起動時ではなく任意の時点でロードすることができるので、これについては実行ファイルを解析しても特定するのは無理だと思います。しかしこれはプログラマが明示的にコードを書くのでどのDLLファイルが必要なのかは明白ですからね。
従来は、システムで共有する必要のあるDLLファイルは何でも\Windows\system32というディレクトリに放り込んでいました。このため、同じファイル名でありながら異なるバージョンのDLLファイルを必要とするアプリケーション同士が競合するといった問題を引き起こしていました。今は実行ファイル名に.configを付けたXMLファイルを作ってその中で必要な記述を行うと、特定のバージョンを指定してロードさせることができるようになりました。これに関連して、\Windows\WinSxSというディレクトリの下にごちゃごちゃとDLLを納めたディレクトリが沢山入っていて、このディレクトリを特定してやることで必要なバージョンのDLLが読み込まれる仕組みになっています。
今日はどのDLLを読み込んでいるかをDependency Walkerで調べて、このディレクトリから必要なDLLファイルとそれに関連したmanifestファイルを取り出してアーカイブに固めて先方に送付。エラーが出たと言われてそのたびに調べなおしてしまいました。既に実行できるようになっている環境だとなかなか何が問題なのか特定できないというのが面倒です…。




この記事へのコメント

この記事へのトラックバック