はい、同じプロジェクト内の同じコードベースでx86とx64の両方をターゲットにすることができます。一般に、VS.NETで適切なソリューション構成を作成すれば問題なく機能します(ただし、完全にアンマネージドDLLへのP / Invokeには、条件付きコードが必要になる可能性があります)。特別な注意が必要な項目は次のとおりです。
- 同じ名前であるが固有のビット数を持つ外部の管理対象アセンブリへの参照(これはCOM相互運用機能アセンブリにも適用されます)
- MSIパッケージ(すでに述べたように、x86またはx64のいずれかをターゲットにする必要があります)
- MSIパッケージ内のカスタム.NETインストーラークラスベースのアクション
アセンブリ参照の問題は、VS.NET内で完全に解決することはできません。これは、指定された名前の参照をプロジェクトに追加できるのは1回だけであるためです。これを回避するには、プロジェクトファイルを手動で編集します(VSでは、ソリューションエクスプローラーでプロジェクトファイルを右クリックし、[プロジェクトのアンロード]を選択してから、もう一度右クリックして[編集]を選択します)。たとえば、アセンブリのx86バージョンへの参照を追加すると、プロジェクトファイルには次のようなものが含まれます。
<Reference Include="Filename, ..., processorArchitecture=x86">
<HintPath>C:\path\to\x86\DLL</HintPath>
</Reference>
その参照タグを、適用するソリューション構成を示すItemGroupタグ内にラップします。例:
<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以外のツールが必要になります。関連する基本的なトリック(共通のMSIと32ビットを作成する)を実行するため、その目的にはCaphyonのAdvancedInstallerを使用します。および64ビット固有のMSIであり、.EXEセットアップランチャーを使用して適切なバージョンを抽出し、実行時に必要な修正を実行します)。
他のツールやWindowsインストーラーXML(WiX)ツールセットを使用しても同じ結果が得られる可能性がありますが、高度なインストーラーを使用すると、非常に簡単に(そして非常に手頃な価格で)代替手段を検討したことがありません。
ただし、高度なインストーラーを使用している場合でも、.NETインストーラークラスのカスタムアクションにWiXが必要になる場合があります。特定のプラットフォームでのみ実行する必要がある特定のアクションを指定するのは簡単ですが(それぞれVersionNT64とNOT VersionNT64の実行条件を使用)、組み込みのAIカスタムアクションは、64ビットマシンでも32ビットフレームワークを使用して実行されます。
これは将来のリリースで修正される可能性がありますが、現時点では(または、別のツールを使用して同じ問題のあるMSIを作成する場合)、WiX 3.0のマネージドカスタムアクションサポートを使用して、適切なビット数のアクションDLLを作成できます。対応するフレームワークを使用して実行されます。
編集:バージョン8.1.2以降、AdvancedInstallerは64ビットのカスタムアクションを正しくサポートします。私の最初の答え以来、InstallShieldとその同類と比較した場合、それでも非常に良い値であるにもかかわらず、残念ながら、その価格はかなり上昇しています...
編集: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>
また、条件はすべてのビルドタイプ、リリースまたはデバッグに絞り込まれ、プロセッサアーキテクチャを指定するだけです。