「同じ形式のプログラムを読み込もうとした」プラットフォームが同じでも


461

64ビットシステムの32ビットアンマネージDLLから関数を呼び出しています。私が得るものは:

BadImageFormatException:不正な形式のプログラムを読み込もうとしました。(HRESULTからの例外:0x8007000B)

最初は、プロジェクトをAny CPUプラットフォームに設定していたので、両方をx86に変更しましたが、このエラーはまだ発生しています。これが本当に私が知っている唯一の修正です。

DLLは他のプログラム(ソースがない)で使用できるため、破損していません。依存関係が見つからないのではないかと思ったのですが、チェックしてみました。さらに、DllNotFoundExceptionその場合はをスローしませんか?

他に何ができますか?そして、「代わりに64ビットのアンマネージDLLを使用する」と言う前に、存在しないことを指摘しておきます。;)


1
どのプロジェクトをx86に変更しましたか?そして、デバッガを介して、または手動で、例外が発生したときにそれらをどのように実行しますか?後者の場合、x86に変更したときに、bin \ディレクトリに新しいフォルダーが作成されたことに気付きましたか?これは基本的に、ファイルのbin \ x86 \ Debugです。
Lasse V. Karlsen、2010年

実行可能ファイルが32ビットモード(プロセスマネージャーでは* 32)で実行されていることを確認できますか?
JP Alioto、2010年

@Lasse V. Karlsen:ええ、各プロジェクトでプラットフォームを変更したとき、出力パスからx86ビットを削除しました。私の最初のプロジェクトは、アンマネージDLLの関数をラップするDLLです。2番目のプロジェクトは、最初のDLLのラッパーを使用する実行可能ファイルです。どちらもx86に設定されています。
David Brown

@JP:実際には、プロセスマネージャは32ビットプロセスとして実行されていることを示していません。何故ですか?
David Brown

回答:


532

IIS 7(または64ビットOSマシン)で32ビットアプリケーションを実行しようとすると、同じエラーが発生します。したがって、IIS 7からアプリケーションのアプリケーションプールを右クリックし、[詳細設定]に移動して、[32ビットアプリケーションを有効にする]を[TRUE]に変更します。

ウェブサイトを再起動すると、機能するはずです。

ここに画像の説明を入力してください


1
これが答えだったときに、私は余分なIISコンポーネントのインストールを回避してきました...このオプションを選択することのマイナス面を誰かが提案できますか?
notidaho

3
これに関するパフォーマンスの問題についての良い議論は次のとおりです。stackoverflow.com
Ben Power

SharpSvnに問題があり、これは役に立ちません。:( Sthはこのアセンブリで非常に間違っていると私は言います...
user2173353

4
この質問はIISについてまったく触れていないため、この答えは私にとってwtfです。
kristianp

129

どういうわけか、構成マネージャの[ ビルド]チェックボックスが私の実行可能ファイルに対してオフになっているため、古いAny CPUビルドで実行されていました。それを修正した後、Visual Studioはアセンブリをデバッグできないと不平を言いましたが、それは再起動で修正されました。


どうもありがとう。これも私を得ました。構成マネージャーでビルドをチェックし、動作するようになりました(WPFデスクトップアプリケーション)。
ダングルンド2013年

1
上記のすべてを実行し、プラットフォーム設定、ビルド構成設定を確認し、ソリューションをクリーンアップしても問題が解決しない場合は、DLLのすべてのインスタンスを検索して削除してください。
ウィルカルダーウッド2013

VS 2015ではこれはまだ有効です-再起動する必要はありませんでしたが:)
信じ

それでおしまい!答えは、Configuration Managerの設定に再度アクセスすることです。
AndyUK

74

Visual Studio、右あなたのクリックプロジェクトを - >左ペインでクリックし、ビルド ]タブを、

プロジェクトプロパティ、ビルドタブ

プラットフォームターゲットのx86を選択します(または、より一般的なアーキテクチャは、あなたがにリンクされているライブラリと一致させます)

プロジェクトプロパティ、プラットフォームターゲット

これが誰かに役立つことを願っています!:)


2
これによりVS2013での問題が修正されました。別の修正として、「プラットフォームターゲット」を「すべてのCPU」のままにして、「32ビット優先」チェックボックスをオンにすることも見つかりました。
user1069816

2
「32ビット
優先

1
はい。ただし、プロジェクトを「任意のCPU」で「x64」に変換しました。私の32ビットプロジェクトは正常に機能していますが、64ビットに変換したコードと同じですが、そのプロジェクトは32ビットとして正常に機能しません。適切な64ビット変換プロセスを教えていただけますか?
Ismayil S

@IsmayilSは、リンク先のライブラリの64ビットバージョンを使用していることを確認してください
Marvin Thobejane

53

私もこの問題を抱えていました。ここですべての提案を試みましたが、助けにはなりませんでした。

私はそれを修正するためにそれをチェックする別のことを見つけました。Visual Studioでプロジェクトを右クリックし、[プロパティ]を開きます。[コンパイル](または[ビルド])タブをクリックし、下部にある[高度なコンパイルオプション]をクリックします。

ドロップダウン「ターゲットCPU」を確認します。作成する「プラットフォーム」と一致する必要があります。つまり、「すべてのCPU」を構築している場合、「ターゲットCPU」は「すべてのCPU」と表示されます。すべてのプラットフォームをアクティブにして、この設定を確認します。


2
コンパイラを使用するだけの場合、私の修正は、コンパイラフラグに「/ platform:x86」を追加することでした。
Urchin

これで修正されました。「ビルド」タブで「プラットフォームターゲット」を調整する必要がありました。
Jowen、2013年

64ビットを使用している場合は、「32ビット優先」フラグも確認してください。無効にする必要がありました。
N4ppeL 2019

51

緑の矢印ボタンをクリックしてアプリケーションを実行したときにこのエラーが発生したが、それでも64ビットでアプリを実行したい場合。VS 2013、2015、2017、2019でこれを行うことができます

移動:ツール>オプション>プロジェクトとソリューション> Webプロジェクト> 64ビットバージョンのIIS Expressを使用する


3
ありがとう。私はたくさん試してみましたが何も役に立ちませんでした。あなたは私の命の恩人です。私は64ビットOSを使用していますが、64ビットのVisual Studio [理由は不明ですが32ビットとして動作します]をインストールしています。プラットフォームターゲットをx64に配置すると、エラーBadImageFormatExceptionがスローされました。あなたの修正で、それはうまくいきました。私はあなたに賛成票を与えました。あなたは
揺れる

私は私が助けることができてうれしいです:)
paibamboo 2018年

これが私が必要とする答えです。どうもありがとう!
yushulx

おかげで、これで問題が解決しました。Visual Studio 2017 32ビットプロセスで正常に動作します。
samir105

1
VS 2019でも動作します。ありがとう
Jake Gaston

36

Any CPUを使用している場合、[ 32ビットを優先 ]オプションをオンにすると、この問題が発生する可能性があります。

プロジェクトのプロパティの[ ビルド ]タブでこのオプションをオフにしてください。

ここに画像の説明を入力してください


3
Visual Studioのどこにこのオプションを見つけるかを指定できれば、役に立ちます。
トリシス2014

@trysis、このオプションはプロジェクト設定ペインのビルドページにあります。
ドリューノークス2014

1
私はそれを置くことは役に立つだろうと言っていました。この答えが立っているので、StackOverflowの不幸な、おそらく新しいユーザーにそれを見つける場所を伝えるコンテキストはありません。
トリシス2014

このフォームを取得するためのパスは何ですか?見つかりません
アドルフォコレア

Visual Studioでプロジェクトを右クリックし、[プロパティ]を選択します。
Drew Noakes、2017年

8

この投稿のトピックは少し外れていましたが、このエラーメッセージを検索すると、ここに移動しました。

チームシステムを介してビルドしていて、このエラーが発生した場合、ビルド定義プロセスのタブには「MSBuildプラットフォーム」設定があります。これが「自動」に設定されている場合、この問題が発生する可能性があります。「X86」に変更すると、エラーを解決できます。


これは私が経験していたことに最も近い答えです。私はx86でなければならないdllを持っていました。別のプロジェクトで使用しました。デフォルトではAnyCPUでした。彼らは一致する必要があります。この場合、それほど大きな違いはなかったので、新しいプロジェクトをx86に変更しました。
2014年

8

私の場合、C#でネイティブDLLを使用していました。このDLLは、欠落していた他のいくつかのDLLに依存していました。これらの他のDLLが追加されると、すべてが機能しました。


4

@paibambooの答えに基づく

彼は言った:ツール>オプション>プロジェクトとソリューション> Webプロジェクト> IIS Expressの64ビットバージョンを使用する

同僚はこのチェックボックスをオンにしましたが(明示的に探しました)、問題のエラーメッセージがありました。数時間後、彼はボックスのチェックを外して再度チェックしました。驚いたことに、コードは正常に実行されました。

このボックスの状態が保存されていない場所が2つあり、同期が取れなくなったようです。同期を解除して再チェックすると、再び同期されました。

より知識のあるユーザーへの質問:先週(VS 2015の場合)状態を非同期にする更新または何かがありましたか?


3

この回答も参照してください。これは私にとって同じ問題を解決しました。

Luis Mackによる2010年5月12日の午前8:50に投稿された64ビットマシンでコンパイルした特定のプロジェクトについてのみ、同じ問題が見つかりました。SEEMSが機能するための修正は、デザイナーでユーザーコントロールまたはフォームが編集されるたびに、画像ストリーム内の1つの文字を手動で変更することです。

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

への変更

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

つまり、行の最後で00LjAuMC4w0yLjAuMC4wに戻ります(00が0yに戻ります)。


1
リンクの簡単な要約が参考になります@Shaul :)
Marvin Thobejane 2013年

壮大。ありがとう、ブリーフィングはコメントにコンテンツを追加します
Marvin Thobejane 2013年

2

私の場合、Reflectionを介して参照DLLをリロードする小さな.exeを使用しています。だから私は私の日を節約するこれらのステップを行うだけです:

ソリューションエクスプローラーのプロジェクトプロパティから、[ビルド]タブで、x86から​​ターゲットプラットフォームを選択します


2

私の場合、MSTestを介してテストを実行していて、32ビットと64ビットの両方のDLLをテストディレクトリに展開していることがわかりました。プログラムは64ビットDLLを優先し、それを失敗させていました。

TL; DRテストには32ビットDLLのみを展開するようにしてください。


2

同様の問題があり、プラットフォームターゲットをx86に設定することで解決できました。 プロジェクトプロパティ->ビルド


それで、x86 dllはx64とは違うのですか?参照されているdllファイルでこれを検出する方法はありますか?
NoBugs

@NoBugsできるように見えます。このスレッドを
Joe

1

私はこの問題を「Windows」の方法で解決しました。すべての設定を確認し、ソリューションをクリーニングして再構築した後、ソリューションを閉じて再度開きました。その後、それは機能し、VSはおそらくクリーニング中にいくつかのものを取り除くことができませんでした。論理的な解決策が機能しない場合、私は通常、非論理的な(または非論理的に見える)解決策に目を向けます。Windowsは私を失望させません。:)


1

ビルドバージョンをサーバー上の.NETバージョンに一致させることで、この問題を修正することができました。

.exeをダブルクリックして、どうなるかを確認したところ、4.5をインストールするように指示されました。

だから私は4.0にダウングレードし、それはうまくいった!

したがって、バージョンが一致していることを確認してください。私の開発ボックスで問題なく動作しましたが、サーバーには古い.NETバージョンがありました。


1

私の場合、ファイルの内容が間違っていました。DLLはWebからダウンロードされましたが、DLLのコンテンツはHTMLページでした:Dバイナリファイルであるかどうか、正しいDLLのように見えるかどうかを確認してください:)


1

.NETコアでも同じ問題が発生していました。解決策は、32ビットの.netcoreランタイムをダウンロードし、プロジェクトターゲットを用意することでした。x86

あなたの中csprojのファイルの追加

  <PropertyGroup>
    <PlatformTarget>x86</PlatformTarget>  
  </PropertyGroup>

  <PropertyGroup>
    <RunCommand Condition="'$(PlatformTarget)' == 'x86'">$(MSBuildProgramFiles32)\dotnet\dotnet</RunCommand>    
  </PropertyGroup>

これはWindowsマシンで使用されていました。Linux/ OSXではパスなどを調整する必要があります



0

1:[ツール]> [オプション]> [プロジェクトとソリューション]> [Webプロジェクト]> [64ビットバージョンのIIS Expressを使用する]に移動します。2:Webサービスプロジェクトの設定を以下に変更します。 ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.