506

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

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

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

DLL は、他のプログラム (ソースを持っていない) で使用できるため、破損していません。おそらく依存関係が見つからないのではないかと思いましたが、確認したところ、すべてそこにありました。さらに、その場合は a をスローしませんDllNotFoundExceptionか?

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

4

24 に答える 24

572

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

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

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

于 2011-01-06T20:08:11.540 に答える
143

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

于 2010-01-08T01:59:53.327 に答える
79

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

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

または、Project Properties > Web > Bitness でプロジェクトごとに実行できます。 IIS Express ビット数

于 2016-07-05T13:46:57.163 に答える
56

私もこの問題を抱えていました。ここですべての提案を試しましたが、役に立ちませんでした。

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

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

于 2011-12-12T19:13:01.113 に答える
40

Any CPUを使用している場合、Prefer 32-bitオプションがチェックされていると、次の問題が発生する可能性があります。

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

ここに画像の説明を入力

于 2013-09-24T13:55:06.417 に答える
12

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

于 2012-12-11T20:30:25.417 に答える
8

この投稿のトピックから少し外れましたが、このエラー メッセージを検索するとここにたどり着きました。

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

于 2012-10-05T13:55:56.223 に答える
6

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

于 2019-08-19T02:34:17.093 に答える
3

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

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

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

への変更

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

つまり、行の終わりで00LjAuMC4wが0yLjAuMC4w戻ります(00が0yに戻ります)

于 2012-03-21T13:45:20.857 に答える
2

私の場合、リフレクションを介して参照された DLL をリロードする小さな .exe を使用しています。したがって、私は次の手順を実行するだけで、1 日を節約できます。

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

于 2012-02-15T09:21:50.940 に答える
2

私の場合、MSTest を使用してテストを実行していたところ、テスト ディレクトリに 32 ビットと 64 ビットの両方の DLL をデプロイしていることがわかりました。プログラムが 64 ビット DLL を優先していたため、DLL が失敗していました。

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

于 2015-05-07T19:30:07.037 に答える
1

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

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

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

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

于 2015-12-16T21:58:48.597 に答える
1

アンマネージ DLL をインポートする場合は、次を使用します。

CallingConvention = CallingConvention.Cdecl 

DLL インポート メソッドで。

于 2019-10-10T10:31:30.550 に答える
1

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

于 2013-04-30T09:38:40.720 に答える
1

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

csprojファイルに追加します

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

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

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

于 2019-06-27T20:28:13.603 に答える