是的,你可以針對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