是的,您可以在同一项目中使用相同的代码库同时针对x86和x64。通常,如果您在VS.NET中创建正确的解决方案配置,那么一切就将正常进行(尽管P / Invoke到完全不受管的DLL很可能需要一些条件代码):我发现需要特别注意的项目是:
- 引用具有相同名称但具有特定位数的外部托管程序集(这也适用于COM互操作程序集)
- MSI软件包(如前所述,将需要针对x86或x64)
- MSI程序包中任何基于自定义.NET Installer类的操作
程序集引用问题不能完全在VS.NET中解决,因为它仅允许您一次将具有给定名称的引用添加到项目中。若要解决此问题,请手动编辑项目文件(在VS中,在解决方案资源管理器中右键单击您的项目文件,选择“卸载项目”,然后再次右键单击并选择“编辑”)。在添加对某个程序集的x86版本的引用之后,您的项目文件将包含以下内容:
<Reference Include="Filename, ..., processorArchitecture=x86">
<HintPath>C:\path\to\x86\DLL</HintPath>
</Reference>
将该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工具:我更喜欢Caphyon的Advanced Installer,因为它可以实现所涉及的基本技巧(创建通用的MSI以及32位和特定于64位的MSI,并使用.EXE安装程序启动器提取正确的版本并在运行时进行所需的修复)。
使用其他工具或Windows Installer XML(WiX)工具集,您可能可以达到相同的结果,但是Advanced Installer使事情变得如此简单(而且价格合理),我从未真正考虑过替代方案。
即使使用Advanced Installer,您可能仍然需要WiX的一件事是用于.NET Installer类自定义操作。虽然指定仅应在某些平台上运行的某些操作很简单(分别使用VersionNT64和NOT VersionNT64执行条件),但是内置的AI自定义操作将使用32位框架(即使在64位计算机上)执行。
可能会在将来的版本中修复此问题,但目前(或使用其他工具创建存在相同问题的MSI时),可以使用WiX 3.0的托管自定义操作支持来创建具有适当位数的操作DLL。将使用相应的框架执行。
编辑:从版本8.1.2开始,高级安装程序正确支持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>
该条件也减少到所有构建类型(发行或调试),仅指定处理器体系结构。