はい、x86とx64の両方を同じプロジェクトの同じコードベースでターゲットにできます。一般に、VS.NETで適切なソリューション構成を作成すれば、問題なく機能します(完全に管理されていないDLLへのP / Invokeには、いくつかの条件付きコードが必要になる可能性が最も高いです)。
- 同じ名前で独自の特定のビット数を持つ外部マネージアセンブリへの参照(これはCOM相互運用機能アセンブリにも適用されます)
- MSIパッケージ(既に述べたように、x86またはx64のいずれかをターゲットにする必要があります)
- MSIパッケージ内のカスタム.NETインストーラークラスベースのアクション
アセンブリ参照の問題は、特定の名前の参照をプロジェクトに一度だけ追加できるため、VS.NET内で完全に解決することはできません。これを回避するには、プロジェクトファイルを手動で編集します(VSでは、ソリューションエクスプローラーでプロジェクトファイルを右クリックし、[プロジェクトのアンロード]を選択してから、もう一度右クリックして[編集]を選択します)。たとえば、x86バージョンのアセンブリへの参照を追加すると、プロジェクトファイルには次のようなものが含まれます。
<Reference Include="Filename, ..., processorArchitecture=x86">
<HintPath>C:\path\to\x86\DLL</HintPath>
</Reference>
適用するソリューション構成を示すItemGroupタグ内にそのReferenceタグをラップします。例:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<Reference ...>....</Reference>
</ItemGroup>
次に、ItemGroupタグ全体をコピーして貼り付け、64ビットDLLの詳細が含まれるように編集します。例:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<Reference Include="Filename, ..., processorArchitecture=AMD64">
<HintPath>C:\path\to\x64\DLL</HintPath>
</Reference>
</ItemGroup>
VS.NETでプロジェクトをリロードした後、これらの変更によって[アセンブリ参照]ダイアログが少し混乱し、間違ったターゲットプロセッサを使用したアセンブリに関する警告が表示される場合がありますが、すべてのビルドは正常に機能します。
MSIの問題の解決は次の段階ですが、残念ながらこれには非VS.NETツールが必要になります。そのためには、CaphyonのAdvanced Installerが好まれます。および64ビット固有のMSI、および.EXEセットアップランチャーを使用して適切なバージョンを抽出し、実行時に必要な修正を行います)。
おそらく他のツールやWindowsインストーラーXML(WiX)ツールセットを使用しても同じ結果を得ることができますが、高度なインストーラーによって物事が非常に簡単になり(しかも非常に手頃な価格で)、他の方法を検討したことがありません。
ただし、高度なインストーラーを使用する場合でもWiXが必要な場合があるのは、.NETインストーラークラスのカスタムアクション用です。特定のプラットフォームでのみ実行する必要がある特定のアクションを指定するのは簡単です(それぞれ、VersionNT64およびNOT VersionNT64実行条件を使用)、組み込みのAIカスタムアクションは、64ビットマシンでも、32ビットフレームワークを使用して実行されます。
これは将来のリリースで修正される可能性がありますが、今のところ(または別のツールを使用して同じ問題のあるMSIを作成する場合)、WiX 3.0のマネージカスタムアクションサポートを使用して、適切なビット数のアクションDLLを作成できます対応するフレームワークを使用して実行されます。
編集:バージョン8.1.2以降、アドバンストインストーラーは64ビットのカスタムアクションを正しくサポートしています。私の元の回答以来、InstallShieldやそのilkと比較するとまだ非常に良い値ですが、残念ながらその価格はかなり高くなっています...
編集:DLLがGACに登録されている場合は、この方法で標準参照タグを使用することもできます(例としてSQLite)。
<ItemGroup Condition="'$(Platform)' == 'x86'">
<Reference Include="System.Data.SQLite, Version=1.0.80.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86" />
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x64'">
<Reference Include="System.Data.SQLite, Version=1.0.80.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=AMD64" />
</ItemGroup>
条件は、すべてのビルドタイプ、リリースまたはデバッグにまで縮小され、プロセッサアーキテクチャを指定するだけです。