3

Visual Studio 2012 を搭載した Windows 7 マシンで .NET 4.5 アプリを作成しましたが、Windows 7 にインストールして正常に動作します。

Windows 8 マシンに展開しようとすると、イベント ビューアーにあまり有用な出力がなく、壊滅的なクラッシュが発生します。Dependency walker
のトレースは、1 つまたは一部のコア Windows DLL でメソッドが見つからなかったことを示しています。例えば:

LoadLibraryExW("C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscoreei.dll", 0x0000000000000000, LOAD_WITH_ALTERED_SEARCH_PATH) returned 0x00007FFDEA780000.  
GetProcAddress(0x00007FFDEA780000 [MSCOREEI.DLL], "RegisterShimImplCallback") called from "MSCOREE.DLL" at address 0x00007FFDEA82F3A9 and returned 0x00007FFDEA783444.  
GetProcAddress(0x00007FFDEA780000 [MSCOREEI.DLL], "RegisterShimImplCleanupCallback") called from "MSCOREE.DLL" at address 0x00007FFDEA82F3BC and returned NULL. Error: The specified procedure could not be found (127).

mscoreei.dll を調べると、次のことに気付きました。

Windows 7 マシン
v4.0.30319.18408
613,456 バイト

Windows 8 マシン
v4.0.30319.33440
633,424 バイト

両方のマシン ( ASoft .NET バージョン ディテクタによると) には .NET 4.5 Full があります。

マシンによって .NET のビルドが異なるのはなぜですか? また、Windows 7 マシンのコンパイラが Windows 8 マシンの正しいバージョンをターゲットにしていることを確認するにはどうすればよいですか?

4

3 に答える 3

5

はい、これは完全に正常です。Windows 8 には、.NET 3.5 のカスタム バージョンもあります。.NET Framework は、オペレーティング システムのバージョンに大きく依存しています。Windows 8にプリインストールされている理由.

この依存関係は、.NET フレームワークの「ローダー シム」である MSCoree にとって特に注目に値します。それはかなり劇的なスタントを引き出し、Windows に 32 ビット EXE ファイルから 64 ビット プロセスを作成させることができます。これは単純なことではありません。Windows のローダーと緊密に連携してそれを実現し、内部データ構造にパッチを適用して 64 ビット プロセスを作成します。

「指定されたプロシージャが見つかりませんでした」というエラーが表示されることも珍しいことではありません。これが、暗黙のインポート依存関係を持つ代わりに GetProcAddress() を使用する理由です。GetProcAddress() の使用は、特定の API 関数が実際にサポートされているかどうかを確認するための非常に一般的な手法です。

あなたのプログラムがクラッシュしている本当の理由をまだ見つけていないことを真剣に疑っています. AppDomain.CurrentDomain.UnhandledException イベントを実装して未処理の例外を報告することを忘れないでください。Windows から取得したクラッシュ情報はまったく役に立ちません。

于 2013-10-31T14:34:06.470 に答える
1

コードまたはサードパーティの DLL のどこかで、LOAD_WITH_ALTERED_SEARCH_PATH 値が使用されているようです。

これは、LoadLibraryEx関数がどこかで呼び出されているためです。これにより、Windows 8 と比較して Windows 7 で異なるkernel32.dll がインポートされます。

エラーに記載されている LOAD_WITH_ALTERED_SEARCH_PATH は、Windows 7 で既に廃止されています。これは、Windows 8 にはまったく存在しない可能性があります。

Windows 8.1 に Visual Studio をインストールし、そこから例外が発生するまでコードをデバッグする必要があると思います。おそらく、7 でコンパイルして 8 で実行し、不可解なエラー メッセージを解読しようとするよりも、どこで問題が発生したかを特定するのに役立つでしょう。問題のあるライブラリが見つかったら、ベンダーに連絡して、更新されたバージョンがあるかどうかを確認できます。

于 2013-10-31T12:29:46.537 に答える
0

これは特に役立つ回答ではありませんが、Win 8 の x64 プロセスでの実行を処理できないサードパーティの dll でした。実際の問題の正確な原因に関する詳細情報はありません

于 2014-04-07T22:54:55.273 に答える