10

C++dllを呼び出す32ビットの.Netアプリケーションwinformがあります。アプリをインストーラーにパッケージ化し、少なくとも20台程度のマシンにインストールして正常に実行します。このアプリは元々開発されており、Win 7 x64マシン(私のもの)で正常に動作します。

ただし、上司のデスクトップ(Win 7 x64)で実行すると、アプリケーションが起動しません。そうそう...

アプリケーションを起動しようとすると、JITダイアログが表示されます。

System.IO.FileNotFoundException:指定されたモジュールが見つかりませんでした。(HRESULTからの例外:0x8007007E)

私が実行すると、ボスマシンのexeに依存しますが、app exeはx86であると表示されますが、x64のすべての依存dllは、エラーとしてフラグを立てます。実行するときは、マシン上のアプリによって異なりますが、exeとdllはすべてx86とマークされています。

これはマシン間でどのように変わるのでしょうか?インストーラーは通常の方法で解凍してコピーするだけで、他の多くのx64マシンで正常に動作します...

当然、2時間離れた彼のマシンでしか壊れず、見本市が開催されます。はぁ。非常に混乱...

=================解決済み==================

そこで修正しました。欠落しているdllを見つけるのは少し注意が必要でした。

まず最初に、x64ボックスに対して間違ったバージョンのdependsを実行しました。そのため、アプリがx64dllを探していると誤って報告されていました。正しいバージョンを実行していれば、もっと早く問題を見つけられたと思います。

私たちにとってそれを解決したのは、システム内部からのプロセスモニターのログを見ることでした。すべてのファイルアクセスとレジストリの読み取りをログに記録します。ログには、Direct X11dllでの読み取りの失敗がすぐに示されました。

他のアプリの以前のインストーラーがDX11dllの一部をインストールしていたことが判明しました。これでインストーラーがだまされ、DirectX 11の手順がスキップされたため、dllが見つかりませんでした。

助けてくれてありがとう!

4

1 に答える 1

10

これは単純な「ファイルが見つかりません」という種類のエラーですが、どのDLLが見つからなかったかがわからないという非常に厄介な動作を伴います。これはC++DLLである可能性がありますが、暗黙のDLL依存関係である可能性もあります。ランタイムサポートDLLと同様に、非常によく見落とされがちですが、vcredistインストーラーを使用してそれらをデプロイできます。または、DLLのデバッグビルドを展開しますが、これは機能しません。

適切な診断を取得するには、ローダースナップとデバッガーをオンにする必要があります。ツールがインストールされていないマシンで行うのは常に困難です。SysInternalsのProcMonユーティリティは優れた代替手段であり、プログラムがDLLを検索しているのがわかります。生成されるトレースデータの量に溺れてしまいますが。トレースの下から逆方向に作業します。

于 2012-11-20T15:02:33.000 に答える