web-dev-qa-db-ja.com

MSBuildで異なるバージョンのdllを参照する方法

サードパーティのdllのセットを利用するWebアプリケーションプロジェクトがあります。問題は、開発/ステージング環境が32ビットであるのに対し、本番環境は64ビットであるということです。そのため、展開するたびにソリューションを再参照して構築する必要があります。これを自動化したいのですが、MSBuildでどのように処理するのかわかりませんか?

他のすべてのdllは同じですが、サードパーティの3つのdllだけです。


[〜#〜]編集[〜#〜]

私はいくつかの前進を遂げましたが、いくつかのランタイムアセンブリの問題を考えています。

私は3つのdllファイル、1.dll、2.dll、3.dllを持っています。ファイルバージョンはそれぞれ5.1です。 64ビットdllの場合、名前はまったく同じですが、ファイルバージョンが異なります。私が行ったことは、それぞれの名前が1.v5.dll、1.v6.dllなどに変更されます。プロジェクトファイルでは、次のように各dllを参照しています。

<Reference Include="1.v5.dll" Condition="'$(Platform)'=='x86'">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>bin\1.v5.dll</HintPath>
  <Private>False</Private>
</Reference>
<Reference Include="1.v6.dll" Condition="'$(Platform)'=='x64'">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>bin\1.v6.dll</HintPath>
  <Private>False</Private>
</Reference>

これはVisualStudio IDEで機能し、私のソリューションはファイルをコンパイルしますが、Webサイトを実行しようとすると、次のエラーが発生します...

ファイルまたはアセンブリ '1.v5'またはその依存関係の1つを読み込めませんでした。見つかったアセンブリのマニフェスト定義がアセンブリ参照と一致しません。

これにアプローチする方法について何か考えはありますか?

33
mickyjtwin

これは私が理解したことであり、問​​題なく機能しているようです。

x86x64の2つのソリューションプラットフォームを作成しました。ソリューションディレクトリに「References」という新しいフォルダを作成し、nx86およびx64フォルダを作成しました。\ References\x86\\ References\x64 \次に、それぞれの3つのdllがそれぞれのディレクトリに配置されます。

次に、各プロジェクトのファイルに、次の参照を追加しました。

<Reference Include="{Reference1}" Condition="'$(Platform)'=='x86'">
  <HintPath>..\References\dlls\x86\{Reference1}.dll</HintPath>
</Reference>
<Reference Include="{Reference2}" Condition="'$(Platform)'=='x64'">
  <HintPath>..\References\dlls\x64\{Reference2}.dll</HintPath>
</Reference>

現在、IDE内で開発するときは、ニーズに固有の関連するdllを使用しています。

次に、$(Platform)変数に基づいてdllをbinディレクトリにコピーするビルド後のイベントを追加しました。

20
mickyjtwin

次のように、プロジェクトファイルに条件付き参照を作成できます。

<Reference Include="32bit.dll" Condition="'$(Platform)'=='x86'"/>
<Reference Include="64bit.dll" Condition="'$(Platform)'=='x64'"/>

これをVS内で使用するには、2つのソリューションプラットフォームを作成する必要があります。1つはx86ターゲット用、もう1つはx64ターゲット用です。アクティブなプラットフォームに応じて、dllの1つが選択され、再参照する必要はありません。

Msbuildを使用してこれを自動化するには、別のプラットフォーム/構成/ ...に対して毎回、他のプロジェクトファイルを何度もビルドする新しいプロジェクトファイルを作成します。

<Target Name="BuildAll">
  <MSBuild Targets="myproject.proj" Properties="Platform=x86;Configuration=Debug"/>
  <MSBuild Targets="myproject.proj" Properties="Platform=x64;Configuration=Debug"/>
  <MSBuild Targets="myproject.proj" Properties="Platform=x64;Configuration=Release"/>
</Target>

並行ビルドなどの追加オプションについては、MSBuildタスクリファレンスを参照してください。

39
stijn