509

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

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

アーキテクチャを調整するためにConfigurationManagerに移動するように指示されます。C#DLLは、プラットフォームターゲットx86でセットアップされています。これをAnyCPUなどの他の何かに変更しようとすると、依存している外部DLLの1つにプラットフォームターゲットx86があるため、文句を言います。

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

私はここで何が間違っているのですか?

4

20 に答える 20

572

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

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

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

これにより、警告が消え、アセンブリまたはプロジェクトが「任意のCPU」と互換性がなくなったが、x86固有であることが示されます。これは、x64依存関係を持つ64ビットプロジェクトを構築している場合にも当てはまります。代わりにx64を選択するだけです。

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

于 2012-04-17T18:04:13.760 に答える
153

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

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

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

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

<PropertyGroup>
  <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
</PropertyGroup>
于 2012-10-01T11:36:52.357 に答える
67

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

  • EXEは、x86またはx64を指定することにより、OSを対象としています。
  • DLLは開いたまま(つまり、AnyCPU)であるため、32ビットまたは64ビットのプロセス内でインスタンス化できます。

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

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

アセンブリのロードの微妙な点について詳しくは、こちらをご覧ください。エグゼクティブサマリーは次のようになります。

  • AnyCPU –呼び出しプロセスに応じて、x64またはx86アセンブリとしてロードされます
  • x86 –x86アセンブリとしてロードします。x64プロセスからロードされません
  • x64 –x64アセンブリとしてロードします。x86プロセスからロードされません
于 2012-11-13T23:19:03.957 に答える
24

C#DLLは、プラットフォームターゲットx86でセットアップされています

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

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

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

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

于 2012-04-17T00:57:02.303 に答える
8

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

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

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

于 2016-11-03T13:19:33.803 に答える
5

私は今日この問題を抱えていましたが、Visual Studioで建物の構成を確認するだけでは、構築されていないプロジェクトと参照されているプロジェクトの両方のCPUが表示されたため役に立ちませんでした。

次に、参照されているプロジェクトの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はそれを認識していないようです。

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

于 2017-03-31T12:58:10.590 に答える
4

https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build#directorybuildprops-exampleを使用します。

  • Directory.Build.propsファイルをソリューションフォルダーに追加します
  • これを貼り付けます:
<Project>
 <PropertyGroup>
   <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
 </PropertyGroup>
</Project>
于 2019-11-06T15:02:43.177 に答える
3

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

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

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

于 2012-04-23T19:11:59.793 に答える
3

BuildDavid Sacksの回答に加えて、のタブに移動して、これらの警告を表示しているプロジェクトにProject Properties設定Platform Targetする必要がある場合もあります。x86ご想像のとおり、この設定は構成マネージャーの設定と完全に同期されていないようです。

于 2014-05-04T20:15:15.683 に答える
2

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

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

于 2012-04-11T21:11:06.743 に答える
1

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

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

これは単に何かを設定してから元に戻すことであるように私には思えますが、おそらく私が見ていない舞台裏でもっと多くのことが起こっています。しかし、過去にはかなり一貫して機能していました。

于 2012-11-09T22:26:00.363 に答える
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"/>
于 2014-02-06T18:58:47.280 に答える
1

MSUNITテストDLLが原因で同様の問題が発生しました。私のWPFアプリケーションはx86としてコンパイルされましたが、単体テストDLL(参照されたEXEファイル)は「任意のCPU」としてコンパイルされました。ユニットテストDLLをx86(EXEと同じ)用にコンパイルするように変更し、再解決しました。

于 2014-02-25T12:01:22.930 に答える
1

また、f.csprojがコマンドに基づいて構築されているため、解決が容易ではないMSFakesアセンブリに対してこの警告が表示される場合があります。幸いなことに、Fakesxmlを使用するとそこに追加できます

于 2015-04-24T15:50:51.457 に答える
0

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

于 2015-03-10T11:18:44.833 に答える
0

この警告を解決し、「Configuration Manager」をリリース(混合プラットフォーム)に変更しました。

于 2015-04-15T15:17:21.000 に答える
0

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

于 2015-05-20T15:57:55.113 に答える
0

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

于 2017-09-18T07:09:47.977 に答える
0

ここで答えが見つからない人のために投稿したいだけで、問題は解決しました。

アプリケーションを実行するときは、ソリューションプラットフォームのドロップダウンが正しく設定されていることを確認してください。私はx86を使用していたため、この問題が発生しました。

于 2020-08-30T20:55:21.543 に答える
-1

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

于 2013-10-22T17:40:17.150 に答える