Visual Studioのコンパイルエラー「プロセッサアーキテクチャの不一致」を修正するにはどうすればよいですか?


458

Visual Studio 2010のプロジェクト構成は初めてですが、いくつかの調査を行いましたが、まだこの問題を理解できていません。C#DLLを参照するC ++ DLLを備えたVisual Studioソリューションがあります。C#DLLは他のいくつかのDLLを参照します。いくつかは私のプロジェクト内にあり、いくつかは外部にあります。C ++ DLLをコンパイルしようとすると、次の警告が表示されます。

警告MSB3270:ビルドされるプロジェクト「MSIL」のプロセッサアーキテクチャと参照「[内部C#dll]」、「x86」のプロセッサアーキテクチャの間に不一致がありました。

構成を調整するためにConfiguration Managerに移動するよう指示されます。C#DLLは、プラットフォームターゲットx86でセットアップされます。私は、任意のCPUのように、何か他のものに変更しようとした場合、外部のDLLの1ので、それは文句を言う、それが依存するが、プラットフォームターゲットx86のを持っています。

Configuration Managerを見ると、C#DLLのプラットフォームがx86として、C ++プロジェクトのプラットフォームがWin32として表示されています。これは正しい設定のようです。確かに、自分のC ++プロジェクトのプラットフォームでプラットフォームをx64に設定したくないのですが、これは、他の唯一のオプションです。

ここで何が悪いのですか?


具体的には、Any CPUに変更するとどうなりますか?
ロードチート

2
十分な情報がないため、情報に基づいた提案を行うことはできませんが、ソリューション->プロジェクトのビルド順序を右クリックして、C ++プロジェクトの前にC#プロジェクトがビルドされていることを確認してください。そうでない場合は、[依存関係]タブに移動し、C ++プロジェクトがC#プロジェクトに依存していることをVSに通知します。
ロードチート

2
Visual Studioはこれについてもがらくたです。画面上部のプラットフォームにx64と表示されていますが、警告はビルド中のプロジェクトが「MSIL」であることを示しています。そのため、Visual Studioは、リンゴを使用していないとき、リンゴとオレンジの間に不一致があると言っています。名前をVisual Stupidoに変更できますか?
ポールマッカーシー

私に関する限り、これはVisual Studioのバグです。プラットフォームターゲットとしてx64を選択すると、プロジェクトがMSIL用にビルドされていることがわかります。
ポールマッカーシー2017年

簡単に言えば、プロジェクトにx86またはx64への依存関係がある場合、CPUは使用できません(これは純粋な.NETアプリケーション専用です)。そのため、Any CPUではなく、x64またはx32のいずれかでビルドする必要があります。これはDaveの回答
zar

回答:


513

この警告は新しいVisual Studio 11 Betaと.NET 4.5で導入されたようですが、以前は可能だったと思います。

まず、それは本当に単なる警告です。x86の依存関係を処理しているだけの場合、問題はありません。マイクロソフトは、プロジェクトが「すべてのCPU」と互換性があるが、プロジェクトまたはx86またはx64のいずれかの.dllアセンブリに依存していると警告した場合に警告します。x86依存関係があるため、技術的にプロジェクトは「すべてのCPU」と互換性がありません。警告が消えるようにするには、プロジェクトを「すべてのCPU」から「x86」に実際に変更する必要があります。これは非常に簡単です。手順は次のとおりです。

  1. Build | Configuration Managerメニュー項目に移動します。
  2. リストからプロジェクトを見つけます。[プラットフォーム]の下に「Any CPU」と表示されます。
  3. ドロップダウンから「すべてのCPU」オプションを選択し、次に選択します <New..>
  4. そのダイアログで、[新しいプラットフォーム]ドロップダウンからx86を選択し、[設定のコピー元]ドロップダウンで[すべてのCPU]が選択されていることを確認します。
  5. OKを押します
  6. デバッグ構成とリリース構成の両方にx86を選択する必要があります。

これにより、警告が表示されなくなり、アセンブリまたはプロジェクトが「Any CPU」互換ではなくなり、x86固有になったことが示されます。これは、x64に依存する64ビットプロジェクトをビルドする場合にも当てはまります。代わりにx64を選択するだけです。

もう1つの注意点は、プロジェクトが純粋な.NETプロジェクトである場合、プロジェクトは通常「すべてのCPU」と互換性がある可能性があることです。この問題は、特定のプロセッサアーキテクチャを対象とする依存関係(サードパーティのdllまたは独自のC ++管理プロジェクト)を導入した場合にのみ発生します。


3
Visual Studio 2012のRTWをインストールし、既存の2010ソリューションを開いただけで同じ警告が表示されるようになったので、RTWにまだ存在しています。
Tod Thomson

4
そうは言っても、Davidの答えは正しいと思います。この警告は、アプリが本当に「AnyCPU」ではないことを通知しているため、最終的に間違ったアーキテクチャにデプロイすると問題が発生します。
Tod Thomson

6
それは非常によく何かを傷つけることができます。Any CPU exeは64ビットOSでx64としてロードされ、x86 dllをロードできません。したがって、特定のプラットフォームに依存している場合は、実際にプラットフォームを正しく設定する必要があります。
Yaur 2013年

1
VS C#2010 Expressに[ビルド]メニューがないようです。どうすればアクセスできますか?彼らが物事を隠さないことを望みます。
Xonatron 2013

1
Visual Studio 2010 Expressでビルドメニューを有効にする方法を見つけたところ:[ツール]メニュー-> [設定]-> [エキスパート設定]を選択
Xonatron

144

これは非常に頑固な警告であり、有効な警告ですが、サードパーティのコンポーネントの使用やその他の理由により解決できない場合があります。私のプロジェクトプラットフォームがAnyCPUであり、AMD64用にビルドされたMSライブラリを参照しているために警告が発生することを除いて、同様の問題があります。ちなみにこれはVisual Studio 2010にあり、VS2012と.Net 4.5をインストールすることで導入されたようです。

参照しているMSライブラリを変更することはできません。また、ターゲットの展開環境は64ビットのみになることがわかっているため、この問題は無視しても問題ありません。

警告はどうですか?Microsoft はConnectレポートに対してその警告を無効にすることが1つの選択肢であると投稿しまし。これを行う必要があるのは、ソリューションアーキテクチャを十分に理解していて、展開ターゲットを完全に理解していて、それが開発環境以外の問題ではないことを知っている場合のみです。

プロジェクトファイルを編集して、このプロパティグループと設定を追加し、警告を無効にすることができます。

<PropertyGroup>
  <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
</PropertyGroup>

1
このソリューションに関する他の唯一の公式のMS参照は、Microsoft .NET Framework 4.5 RC Readmeファイルにあります。奇妙なことに、RTM Readmeファイルから削除されました。
JohnC 2013

4
これは機能しますが、「参照アセンブリ...アプリケーションとは異なるプロセッサを対象としています」という警告のバリエーションでは機能しません。この警告に同様の設定があったらすばらしいと思いませんか?
ジミー

6
「私のプロジェクトプラットフォームはAnyCPUで、AMD64用にビルドされたMSライブラリを参照しています」...これは間違っています。ターゲットのデプロイは常に64ビットであるため、プラットフォームをx64に設定できます。これにより、64ビットの想定に違反した場合により適切なエラーが発生し、警告も防止されます。
Ben Voigt

2
@BenVoigtは理論的には素晴らしいアイデアですが、VSがx86プロセスであるため、アプリケーションが64ビットのみであっても、Windowsフォームデザイナなどを実行するには、x86のコントロールビルドが必要です。これは有効ですが、誤った「任意のCPU」ビルドを使用するのは残念な理由です。
jrh

1
@jrh:その後、DLLプロジェクトでGUIを入れて、ビルドすることを AnyCPUとして。EXEは、ネイティブの依存関係と一致するように適切なアーキテクチャでマークする必要があります。ロジックからGUIを適切に分離することは長い道のりです(ただし、ネイティブコードがGUIの一部をレンダリングしている場合など、まだ制限はありますが、両方に対してプロジェクト全体のビルドを行わない限り、デザイナーサポートは失われた原因です) x86およびx64)
Ben Voigt

61

経験則としては、「DLLを開いてEXEを閉じる」、つまり次のようになります。

  • EXEは、x86またはx64を指定して、OSをターゲットにします。
  • DLLは開いたまま(つまりAnyCPU)なので、32ビットまたは64ビットプロセス内でインスタンス化できます。

EXEをAnyCPUとしてビルドする場合、実行しているのはOSに使用するプロセスのビット数に関する決定を延期することだけです。これにより、EXEが好みに合わせてJITされます。つまり、x64 OSは64ビットプロセスを作成し、x86 OSは32ビットプロセスを作成します。

AnyCPUとしてDLLをビルドすると、DLLはどちらのプロセスにも互換性があります。

アセンブリの読み込みの詳細については、こちらを参照してください。エグゼクティブサマリーは次のようになります。

  • AnyCPU –呼び出しプロセスに応じて、x64またはx86アセンブリとしてロード
  • x86 – x86アセンブリとしてロード。x64プロセスからロードされません
  • x64 – x64アセンブリとしてロード。x86プロセスからロードされません

4
このルールは私には理にかなっています。ただし、次の状況を検討してください。NetA.dll(任意のCPU)が使用するNative.dll(x64)、App1.exe(x64)が使用するNetB.dll(任意のCPU)。ここには実際の問題はありませんが、NetA.dllをコンパイルすると警告が表示されます。このアセンブリはNative.dllに直接依存しているので、x64としてマークすることもできます。しかし、NetB.dllをコンパイルするとエラーが発生します。NetB.dllは別のピュアドットネットアプリケーションで使用される一般的なアセンブリであるため、「任意のCPU」として保持します。私の唯一の選択肢は警告を抑制/無視することであると私は結論づけます。はい?
Steve Robbins、2015年

2
Native.dllに依存しているため、警告を抑制してもしなくても、アプリ/アセンブリの系統全体がx64になります。シナリオで抑制が機能する一方で、奇妙な状況が将来発生する可能性があります。たとえば、1)アセンブリNetBがx86環境で使用され、Nativex64がロードされない、または2)顧客がx86バージョンのApp1.exeを望んでおり、NetBが任意のCPUとしてマークされているため、喜んでコンパイルします。スタックの最上位にあるNativex64が読み込まれません
Gustavo Mori

Gustavoのルールは良い原則ですが、プロジェクトはすでにルールに従わないサードパーティのアセンブリ(AnyCPUではなくx86)に依存しているため、この質問で尋ねられた特定の問題には使用できません。したがって、依存関係が存在する限り、プロジェクトのチェーン全体がx86のみを対象にする必要があります。
David Burg

23

C#DLLがプラットフォームターゲットx86でセットアップされている

これは一種の問題であり、DLLは実際にはプロセスのビット数を選択することができません。これは、完全にEXEプロジェクトによって決定されます。これは、読み込まれる最初のアセンブリであるため、そのプラットフォームターゲット設定は、プロセスのビット数をカウントおよび設定するものです。

DLLは選択の余地がなく、プロセスのビット数と互換性がある必要があります。そうでない場合、コードがそれらを使用しようとすると、BadImageFormatExceptionで大きなKaboomを取得します。

したがって、DLLの適切な選択はAnyCPUであり、どちらの方法でも機能します。これはC#DLLにとって非常に理にかなっており、どちらの方法で機能します。ただし、C ++ / CLI混合モードDLLではなく、プロセスが32ビットモードで実行されている場合にのみ機能するアンマネージコードが含まれていることを確認してください。ビルドシステムにそれに関する警告を生成させることができます。それはまさにあなたが得たものです。警告だけですが、適切にビルドされます。

問題をパントするだけです。EXEプロジェクトのプラットフォームターゲットをx86に設定します。他の設定では機能しません。そして、すべてのDLLプロジェクトをAnyCPUに保持します。


1
つまり、明確にするために、私はEXEを構築していません。他の人のEXEで実行するDLLを構築しています。C#DLLのプラットフォームターゲットをAny CPUに変更しても、警告は消えません。これがconnect.microsoft.com/VisualStudio/feedback/details/728901/…の場合かと思います -警告自体は無視しますが、実際にはEXEはC#DLLをロードできますが、C ++ DLLはロードできませんこれが本当の問題だと思います
Paul Eastlund、

実際にVS2010を使用していますか?また、C ++ / CLI DLLをロードできないこともまったくわかりませんでした。診断とは何ですか?この重要な情報で質問を更新してください。
ハンスパッサント

それが接続されていることを100%確信していなかったため、ロードの失敗について投稿していませんでした。VS2010を使用しています。質問文を更新しました。混乱のために非常に残念
ポールEastlund

1
DLLのロードに関連するあらゆる種類のエラーまたは例外を文書化していません。あなたが知っていることを私に言わなければ、私はあなたを助けることができません。頑張ってください。
ハンスパッサント

5

私はこれをした同じ警告を受けていました:

  1. プロジェクトをアンロードする
  2. プロジェクトのプロパティ、つまり.csprojを編集する
  3. 次のタグを追加します。

    <PropertyGroup>
        <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
            None
        </ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
    </PropertyGroup>
  4. プロジェクトをリロードします


2
これは問題を解決していません。特定のプロジェクトの警告を無効にするだけです。しかし、場合によっては、それが有効な解決策であることがわかります。ありがとう!
小さな

4

今日この問題があり、ビルドしていないプロジェクトと参照プロジェクトの両方にCPUが表示されたため、Visual Studioでビルド構成を確認しても役に立たなかった。

次に、参照されたプロジェクトのcsprojを調べて、これを見つけました。

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x64</PlatformTarget>

どういうわけか、このPlatformTargetは構成変更の途中で追加され、IDEはそれを認識していないようでした。

参照先のプロジェクトからこの行を削除すると、問題が解決しました。


これを理解するのに丸一日かかりました。どうもありがとう!:)
SohamC 2018

3

C#DLLにx86ベースの依存関係がある場合、DLL自体はx86でなければなりません。どうすればいいのかわかりません。64ビットの実行可能ファイルは32ビットのライブラリをロードできないため、VSは(たとえば)x64に変更することについて不平を言います。

C ++プロジェクトの構成について少し混乱しています。ビルド用に提供された警告メッセージは、対象のプラットフォームが[MSIL]であることを報告したため、AnyCPUを対象としたことを示していますが、プロジェクトの構成は実際にはWin32であることが示されました。ネイティブのWin32アプリにはMSILを含めないでください。ただし、C#ライブラリとやり取りする場合は、CLRサポートを有効にする必要があります。ですから、情報面にはいくつかのギャップがあると思います。

プロジェクトの正確な構成とそれらがどのように相互に関連しているかについて、もう少し詳しく確認して投稿していただけますか?可能であれば、さらにサポートさせていただきます。


3

David Sacksの回答に加えて、のBuildタブに移動して、これらの警告を出しているプロジェクトにProject Properties設定Platform Targetする必要がある場合もありx86ます。予想どおりかもしれませんが、この設定は構成マネージャーの設定と完全に同期しているようには見えません。


2

C#プロジェクトの場合、x86のターゲットはそれがどのように聞こえるかを実行します。このアセンブリはx86アーキテクチャのみをサポートしていると述べています。x64についても同様です。一方、どのCPUでも、どちらのアーキテクチャでも構わないと言っています。どちらもサポートしています。したがって、次の2つの質問は(1)これらのDLLを使用する実行可能ファイルの構成は何ですか?(2)とはビットネスとはOS /コンピューターの?私が尋ねる理由は、実行可能ファイルが64ビットで実行するようにコンパイルされている場合、すべての依存関係が64ビットモードでも実行できるようにする必要があるためです。Any CPUアセンブリはロードできるはずですが、x86構成でのみ実行できる他の依存関係を参照している可能性があります。実行可能ファイルを64ビットモードで実行する場合は、すべての依存関係と依存関係の依存関係を調べて、すべてが「任意のCPU」または「x64」であることを確認してください。そうしないと、問題が発生します。

多くの点で、Visual StudioはAny CPUとさまざまなアーキテクチャに依存するアセンブリの混合を簡単にコンパイルできません。実行可能ですが、「依存関係のある依存関係」のどこかに2つのバージョンがあるため、「任意のCPU」となるアセンブリをx86とx64で別々にコンパイルする必要があることがよくあります。


DLLをビルドしようとすると失敗するので、実行可能ファイルの構成は適切ですか?(ただしx86です。)私のコンピューターはx64です。
Paul Eastlund、2012

2
使用するビット数を決定するのは実行可能ファイルです。実行可能ファイルがx64として実行されている場合、(直接または間接的に)ロードするものは、x64またはAny CPUでなければなりません。実行可能ファイルがx86として実行されている場合、何でも(直接または間接的に)は、x86または任意のCPUでなければなりません。
Jonathan DeCarlo

1

以前、特にSharePointなどの既存のx64ソリューションにテストソリューションを追加するときに、同様の問題がありました。私の場合、特定のプロジェクトテンプレートがデフォルトで特定のプラットフォームとして追加されるという事実に関係しているようです。

ここで私のためによく働く解決策があります:構成マネージャーですべてを正しいプラットフォームに設定し(アクティブな構成のドロップダウン、通常はデバッグと言う、それに到達するための良い方法です)、プロジェクトのプラットフォーム(プロジェクトのプロパティ)ビルドしてから、すべてをAnyCPUに戻します。一部の依存関係(各プロジェクトのプロパティのDLL)を削除して再追加する必要がある場合や、「32ビットまたは64ビットプロセスでテストを実行する」(Local.testsettingsをダブルクリックしてホストに移動)を変更する必要がある場合があります。

これは何かを設定した後に設定し直しているように見えますが、おそらく私が目にしていない舞台裏でさらに多くのことが起こっています。でも、過去には、私にはかなり一貫して働いていました。


1

私のプロジェクトでは、x86とx64の両方にビルドできる必要があります。これの問題は、一方を使用しているときに参照を追加すると、もう一方を構築するときに文句を言うことです。

私の解決策は、次のような行になるように* .csprojファイルを手動で編集することです。

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=x86"/>

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=AMD64"/>

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"/>

これに変更されます:

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral"/>

1

MS UNITテストDLLによって引き起こされた同様の問題がありました。私のWPFアプリケーションはx86としてコンパイルされましたが、ユニットテストDLL(参照されたEXEファイル)は「任意のCPU」として。ユニットテストDLLをx86(EXEと同じ)用にコンパイルするように変更し、再解決しました。



0

.NET EXE / DLL AnyCPU、およびそれが依存するアンマネージDLLをx86とx64の両方でコンパイルし、おそらく異なるファイル名でバンドルし、次に.NETモジュールがランタイムに基づいて適切なものを動的にロードする方法が必要ですプロセッサアーキテクチャ。それはAnyCPUを強力にします。C ++ DLLがx86またはx64のみをサポートしている場合、AnyCPUはもちろん無意味です。しかし、構成マネージャーとして実装されていない私がまだ実装していない両方のアイデアをバンドルすることは、複数のバンドルのために異なる構成/プラットフォームで同じプロジェクトを2回ビルドする手段さえ提供せず、AnyCPUまたは任意の構成のような他の概念も可能にします。


2
Stackoverflowへようこそ!この答えに少し焦点を当てたり、再フォーマットしたりできますか?
Corley Brigman 2013年

これは、いい質問をしたり、Connectのブログ投稿や機能リクエストをしたりするように聞こえますが、実際にはこれには答えません。
Ben Voigt

0

ビルドで非常に似た警告がありました。私のプロジェクトは.NET 4.5をターゲットに設定され、ビルドサーバーにWindows 8.1 SDK(.NET 4.5.1用)がインストールされました。.NET 4.5.1を対象にプロジェクトを更新した後(私にとっては問題ではなく、完全に新しいアプリケーションの場合)、警告が表示されなくなりました...


0

この警告を解決して、「構成マネージャー」を「リリース(混合プラットフォーム)」に変更しました。


0

SQL Server 2012 SP1 SSISパイプラインスクリプトタスクをコンパイルするときに、SQL Server 2012 SP2をインストールするまで、Visual Studio 2012でこの警告が表示されました。


0

SQLiteで接続を開くときに同じ問題が発生し、Nugetを使用して、プロジェクトで使用されているコンポーネント(SQLite)をインストールすると問題が解決しました!この方法でコンポーネントをインストールして、結果を確認してください


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