32ビットWindows XPマシンでVisual Studio 2005を使用して作成されたC#アプリケーションがあります。WindowsXPマシンでは正常に動作しますが、64ビットWindows 7プロフェッショナルマシンで実行しようとすると、起動時に次のダイアログボックスが表示されます。
詳細は全文です。
See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.
************** Exception Text **************
System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
at ICSNeoCSharp.IcsNeoDll.icsneoTxMessages(Int32 hObject, IcsSpyMessage& pMsg, Int32 lNetworkID, Int32 lNumMessages)
at ICSNeoCSharp.FormDTCApplication.transmitFlowControl(Int32 myArbID) in C:\Documents and Settings\Administrator\Desktop\Adam Stuff ThinkPad\DTC Checker FINAL\frmDTCApp.cs:line 1750
at ICSNeoCSharp.FormDTCApplication.flowControlTimer_Tick(Object sender, EventArgs e) in C:\Documents and Settings\Administrator\Desktop\Adam Stuff ThinkPad\DTC Checker FINAL\frmDTCApp.cs:line 5166
at System.Windows.Forms.Timer.OnTick(EventArgs e)
at System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** Loaded Assemblies **************
mscorlib
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.5472 (Win7SP1GDR.050727-5400)
CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v2.0.50727/mscorlib.dll
----------------------------------------
DTC Checker V1.0
Assembly Version: 1.0.4960.25549
Win32 Version: 1.0.4960.25549
CodeBase: file:///C:/DTC%20Checker%20V1.0%20R3/DTC%20Checker%20V1.0%20R3.exe
----------------------------------------
System.Windows.Forms
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.5468 (Win7SP1GDR.050727-5400)
CodeBase: file:///C:/Windows/Assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.5467 (Win7SP1GDR.050727-5400)
CodeBase: file:///C:/Windows/Assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.5467 (Win7SP1GDR.050727-5400)
CodeBase: file:///C:/Windows/Assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
Microsoft.Office.Interop.Excel
Assembly Version: 12.0.0.0
Win32 Version: 12.0.6600.1000
CodeBase: file:///C:/Windows/Assembly/GAC/Microsoft.Office.Interop.Excel/12.0.0.0__71e9bce111e9429c/Microsoft.Office.Interop.Excel.dll
----------------------------------------
************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.
For example:
<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>
When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.
他の誰かがこのエラーに遭遇し、解決に成功しましたか?
メインアプリはAnyCPU用に構築されているかもしれませんが、すべてのアセンブリがAnyCPUであると確信していますか?ネイティブアセンブリまたはネイティブコードを含むアセンブリはありますか? x86に対して構築されていますか?
file:/// C:/Windows/Microsoft.NET/Framework64/v2.0.50727/mscorlib.dll
これにより、アプリがx64プロセスとして実行されていることがわかりますが、BadImageFormatExceptionの原因である可能性が高いAnyCPUまたはx64ではないアセンブリがあるように見えます。
できることの1つは、32ビットコマンドプロンプト(c:\ windows\SysWow64\cmd.exe)からアプリケーションを実行して、強制的に32ビットプロセスにし、それが機能するかどうかを確認することです。それが機能する場合、AnyCPUではないアセンブリが間違いなくあります。
プロジェクトプロパティ->ビルド->プラットフォームターゲット-> x86は、この問題を解決する場合があります。
私の場合、アプリは64ビット7で32ビットで実行されていたため、0x8007000Bエラーが発生しました。Windows/ syswov64フォルダーでMSVCR110.dllバージョン64ビットをMSVCR110.dllバージョン32ビットに変更することで解決しました。
(64 dllを戻すことを忘れないでください。32ビットアプリを実行するたびに、dll 32を移動するだけです)。
Dllバージョンを見つけることができます here (syswov64フォルダーに貼り付ける前に解凍します)。
私にとっての修正は、IISのアプリケーションプールを変更することでした。アプリケーションプールのプロパティを開き、[詳細設定]に移動します。次に、[32ビットアプリケーションを有効にする]をTrueに変更します。新しいもののデフォルトはFalseです。 CPUをx86に設定することで過去に問題を修正しましたが、コード部分は「任意のCPU」に設定されていました。
私の経験から、そのエラーの原因は.Net Frameworkバージョンです
.Net Frameworkのバージョンと更新を確認し、アプリケーションの.Netバージョンも確認してください。
Wixには現在64ビットがないため、32ビットでコンパイルすることで問題が解決しました。インストーラーmsiはいずれの場合も64ビットになります
調査結果も追加したいと思います。[ビルド]タブのプロジェクトプロパティで[32ビットを優先]をオフにすると、このエラーが発生しました。再確認した後、それはなくなりました。任意のCPUをターゲットとして設定しています。
これは明確な解決策ではなく、単に症状を解決するものであることを認識していますが、助けになるかもしれません。
同じエラーを解決するには、2〜3の異なる回答のソリューションを組み合わせる必要がありました。その理由は、最終的なセットアップには、x86プラットフォームとx64プラットフォームの両方からのdllが含まれていたためです(個別のexeの個別のフォルダーに)。
1)メインアプリのプラットフォームターゲットを64ビットに設定し、構成設定をそのままにしてビルドしました:
2)Deploymentプロジェクトのターゲットプラットフォームをx64に設定します。
3)dllがフォルダ間で混合されていたため、ファイルタイプエディタですべてのdllのソースパスを1つずつ確認し、アーキテクチャに従ってそれらを置き換えました。
上記の組み合わせのみが機能しました。