是的,你可以针对x86和x64的,在同一个项目相同的代码库。我发现需要特别注意的项目是:
一般来说,如果您创建VS.NET的解决方案的配置(虽然P/Invoke来完全托管DLL将最有可能需要一些有条件的代码)的东西会只是工作
- 引用具有相同的名称,但其自身特定位数外管理组件(这也适用于COM互操作程序集)
- MSI软件包(正如已经指出的,将需要针对x86或x64)
- MSI包中的任何基于.NET Installer类的自定义操作
程序集引用问题无法在VS.NET中完全解决,因为它只允许您将具有给定名称的引用添加到项目中。要解决此问题,请手动编辑项目文件(在VS中,右键单击解决方案资源管理器中的项目文件,选择Unload Project,然后再次右键单击并选择编辑)。添加一个参考,比如说,组件的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中,Assembly Reference对话框会被这些改变弄糊涂了,并且你可能会遇到一些有关错误目标处理器的程序集警告,但是所有的构建都可以正常工作。
解决MSI问题是旁边,不幸的是这将需要non-VS.NET工具:我喜欢Caphyon的Advanced Installer用于这一目的,因为它拉了所涉及的基本技巧(创建一个共同的微星,如以及32位和64位特定的MSI,并使用.EXE安装启动器来提取正确的版本,并在运行时进行必要的修正)非常非常好。
您可以使用其他工具或Windows Installer XML (WiX) toolset可能达到同样的效果,但先进的安装程序使事情那么容易(而且是相当实惠的那个),我从来没有真正看的替代品。你可能仍然需要维克斯因为虽然,采用先进的安装程序,即使
一件事,就是你的.NET安装类自定义操作。尽管指定仅应在特定平台上运行的某些操作(分别使用VersionNT64和Not VersionNT64执行条件)很简单,但即使在64位机器上,内置的AI自定义操作也将使用32位框架执行。
这可能会在将来的版本中修复,但现在(或使用不同的工具创建具有相同问题的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>
该条件也降低到所有生成类型,释放或调试,只是指定的处理器体系结构。
@Magnus·约翰逊:你可以用两种配置来完成一半的目标。 MSI有点困难。 – user7116 2008-09-28 13:33:26