ちょっと前にVisual C#を始めたblack_catです。
昨日新しいパソコンを買ったのですが、
前のパソコンで出来ていた事ができなくなりました。
ttp://dokokano.net/~fslasht/warehouse/programs/testBox2d_20090318.zip
のBox2Dのサンプルで、デバッグすると
InitWolrd();
のところで、
BadImageFormatExceptionはハンドルされませんでした。
ファイルまたはアセンブリ 'Box2DX, Version=2.0.1.28279, Culture=neutral, PublicKeyToken=null'、またはその依存関係の 1 つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。
というエラーが出てきてしまいました。
OSはWindowsXP HomeEdition 32bitから、Windows7 HomePremium 64bitに変わりました。
64bitにしたのが原因なのでしょか?
どなたか解決方法を教えていただけないでしょうか?
よろしくお願いします。
C# エラーで困っています
Re:C# エラーで困っています
> 64bitにしたのが原因なのでしょか?
Windows 7 Ultimate (x64)で試してみました。
ビルドは成功しているので実行ファイルはできてますね。
実行ファイルをエクスプローラから実行してみると「動作を終了しました」(アプリケーションエラー)になります。
実行ファイルに32BITフラグを付けて32ビット専用にしてみると実行できました。
付属のBox2DX.dllは32ビットでしか動作しないようです。
Visual C# Expressで作成したプログラムは64ビット版ウインドウズ上では64ビットアプリケーションとして実行されますので32ビット版DLLには直接アクセスできません。
Expressでない有償のVisual Studioだと32ビット専用のアセンブリを作成するオプションがあるのですが。
対策としては、
・ソースコードが入手できるようなので64ビット版Box2DX.dllを作成してデバッグに使う
・Professional以上のエディションのVisual Studioで32ビット専用の実行ファイルを作成する
のいずれかになります。
Windows SDKに付属するCorFlagsツールを使って実行ファイルを32ビット専用に書き換えることができるのですが、書き換えるとVisual C# ExpressのIDEでデバッグできなくなってしまいました。
Expressが32ビットで動作しているのでデバッグできるようにする方法がありそうな気がするのですが。
Windows 7 Ultimate (x64)で試してみました。
ビルドは成功しているので実行ファイルはできてますね。
実行ファイルをエクスプローラから実行してみると「動作を終了しました」(アプリケーションエラー)になります。
実行ファイルに32BITフラグを付けて32ビット専用にしてみると実行できました。
付属のBox2DX.dllは32ビットでしか動作しないようです。
Visual C# Expressで作成したプログラムは64ビット版ウインドウズ上では64ビットアプリケーションとして実行されますので32ビット版DLLには直接アクセスできません。
Expressでない有償のVisual Studioだと32ビット専用のアセンブリを作成するオプションがあるのですが。
対策としては、
・ソースコードが入手できるようなので64ビット版Box2DX.dllを作成してデバッグに使う
・Professional以上のエディションのVisual Studioで32ビット専用の実行ファイルを作成する
のいずれかになります。
Windows SDKに付属するCorFlagsツールを使って実行ファイルを32ビット専用に書き換えることができるのですが、書き換えるとVisual C# ExpressのIDEでデバッグできなくなってしまいました。
Expressが32ビットで動作しているのでデバッグできるようにする方法がありそうな気がするのですが。
Re:C# エラーで困っています
Visual C# Expressで32ビット専用アプリをデバッグする方法が分かりました。
まずCorFlagsツールを入手してください。
Windows SDKに付属しています。
Visual C# Expressでプロジェクトのプロパティを開きます。
『デバッグ』タブの『Visual Studio ホスティング プロセスを有効にする』のチェックを外します。
『ビルド イベント』タブの『ビルド後に実行するコマンド ライン』に
"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\corflags.exe" /32BIT+ "$(TargetPath)"
の一行を入力します。
#corflags.exeのパスはWindows SDKのインストール先に合わせてください。
#あるいはファイル名だけ指定してあらかじめ環境変数でパスを通しておくほうが良いでしょう。
以上で64ビット版ウインドウズでも32ビットで動作するアプリを作成することができてデバッグもできます。
32ビットでのデバッグができなかったのはホスティングプロセス(*.vshost.exe)が64ビットモードで起動するためでした。
ホスティングプロセスの実行ファイルは自動作成されるしCorFlagsツールで書き換えることもできませんでした。
ホスティングプロセスを無効にすると、
・デバッグの起動時間が増える
・イミディエイトウィンドウ(の実行時評価機能)が使えなくなる
といった影響があるそうです。
まずCorFlagsツールを入手してください。
Windows SDKに付属しています。
Visual C# Expressでプロジェクトのプロパティを開きます。
『デバッグ』タブの『Visual Studio ホスティング プロセスを有効にする』のチェックを外します。
『ビルド イベント』タブの『ビルド後に実行するコマンド ライン』に
"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\corflags.exe" /32BIT+ "$(TargetPath)"
の一行を入力します。
#corflags.exeのパスはWindows SDKのインストール先に合わせてください。
#あるいはファイル名だけ指定してあらかじめ環境変数でパスを通しておくほうが良いでしょう。
以上で64ビット版ウインドウズでも32ビットで動作するアプリを作成することができてデバッグもできます。
32ビットでのデバッグができなかったのはホスティングプロセス(*.vshost.exe)が64ビットモードで起動するためでした。
ホスティングプロセスの実行ファイルは自動作成されるしCorFlagsツールで書き換えることもできませんでした。
ホスティングプロセスを無効にすると、
・デバッグの起動時間が増える
・イミディエイトウィンドウ(の実行時評価機能)が使えなくなる
といった影響があるそうです。
Re:C# エラーで困っています
[ビルド]メニューから[構成マネージャ]を選び,アクティブソリューションプラットフォームから「x86」を選択します。
無い場合は,アクティブソリューションプラットフォームから「<新規作成>」を選択,
新しいプラットフォームから「x86」を選択し,「OK」を押し,さらに「閉じる」を押します。
これで32ビットモードのアセンブリを作成できます。
この問題が多かったのか,VS 2010以降デフォルトがAnyCPUではなくx86になっています。
無い場合は,アクティブソリューションプラットフォームから「<新規作成>」を選択,
新しいプラットフォームから「x86」を選択し,「OK」を押し,さらに「閉じる」を押します。
これで32ビットモードのアセンブリを作成できます。
この問題が多かったのか,VS 2010以降デフォルトがAnyCPUではなくx86になっています。
Re:C# エラーで困っています
Yuoさんの方法が簡単そうだったので、使わせていただきました。
ありがとうございました。
ISLeさんもいろいろ調べてくださって、ありがとうございました。参考になりました。
ありがとうございました。
ISLeさんもいろいろ調べてくださって、ありがとうございました。参考になりました。