Evet, aynı projede aynı kod tabanına sahip hem x86 hem de x64'ü hedefleyebilirsiniz. Genel olarak, VS.NET'te doğru çözüm yapılandırmalarını oluşturursanız işler Sadece Çalışır (ancak tamamen yönetilmeyen DLL'lere P / Invoke büyük olasılıkla bazı koşullu kodlar gerektirecektir): özel dikkat gerektirdiğini bulduğum öğeler şunlardır:
- Aynı ada ancak kendi özel bitliklerine sahip dış yönetilen derlemelere başvurular (bu, COM birlikte çalışma derlemeleri için de geçerlidir)
- MSI paketi (daha önce belirtildiği gibi x86 veya x64'ü hedeflemesi gerekecektir)
- MSI paketinizdeki tüm özel .NET Installer Sınıfı tabanlı eylemler
Derleme başvurusu sorunu tamamen VS.NET içinde çözülemez, çünkü yalnızca bir projeye belirli bir adla bir başvuru eklemenize izin verir. Bu sorunu çözmek için proje dosyanızı manuel olarak düzenleyin (VS'de, Çözüm Gezgini'nde proje dosyanızı sağ tıklayın, Projeyi Kaldır'ı seçin, ardından tekrar sağ tıklayın ve Düzenle'yi seçin). Örneğin bir derlemenin x86 sürümüne bir başvuru ekledikten sonra, proje dosyanız aşağıdaki gibi bir şey içerecektir:
<Reference Include="Filename, ..., processorArchitecture=x86">
<HintPath>C:\path\to\x86\DLL</HintPath>
</Reference>
Bu Referans etiketini, geçerli olduğu çözüm yapılandırmasını belirten bir ItemGroup etiketi içine sarın, örneğin:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<Reference ...>....</Reference>
</ItemGroup>
Ardından, ItemGroup etiketinin tamamını kopyalayıp yapıştırın ve 64 bit DLL'nizin ayrıntılarını içerecek şekilde düzenleyin, örneğin:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<Reference Include="Filename, ..., processorArchitecture=AMD64">
<HintPath>C:\path\to\x64\DLL</HintPath>
</Reference>
</ItemGroup>
Projenizi VS.NET'te yeniden yükledikten sonra, Montaj Referansı iletişim kutusu bu değişikliklerle biraz karışacak ve yanlış hedef işlemciye sahip derlemeler hakkında bazı uyarılarla karşılaşabilirsiniz, ancak tüm yapılarınız iyi çalışacaktır.
Bir sonraki adımda MSI sorununun çözümü var ve maalesef bu , VS.NET dışı bir araç gerektirecek: Bu amaç için Caphyon'un Gelişmiş Yükleyicisini tercih ediyorum , çünkü ilgili temel numarayı (32-bit'in yanı sıra ortak bir MSI oluşturun) ve 64-bit özel MSI'ları ve doğru sürümü ayıklamak ve çalışma zamanında gerekli düzeltmeleri yapmak için bir .exe kurulum başlatıcısı kullanın) çok, çok iyi.
Muhtemelen diğer araçları veya Windows Installer XML (WiX) araç setini kullanarak aynı sonuçları elde edebilirsiniz , ancak Advanced Installer işleri o kadar kolaylaştırıyor (ve bu konuda oldukça uygun), alternatiflere hiç bakmadım.
Eğer bir şey olabilir Gelişmiş Installer kullanırken bile hala da uygun WiX gerektirir NET Yükleyici Sınıf özel eylemler içindir. Yalnızca belirli platformlarda çalışması gereken belirli eylemleri belirlemek önemsiz olsa da (sırasıyla VersionNT64 ve NOT VersionNT64 yürütme koşullarını kullanarak), yerleşik AI özel eylemleri 64 bit makinelerde bile 32 bit Çerçeve kullanılarak yürütülecektir. .
Bu, gelecekteki bir sürümde düzeltilebilir, ancak şimdilik (veya aynı soruna sahip MSI'larınızı oluşturmak için farklı bir araç kullanırken), WiX 3.0'ın yönetilen özel eylem desteğini, uygun bitlik düzeyine sahip eylem DLL'leri oluşturmak için kullanabilirsiniz. ilgili Çerçeve kullanılarak yürütülecektir.
Düzenleme: 8.1.2 sürümünden itibaren, Advanced Installer 64-bit özel eylemleri doğru şekilde destekler. Orijinal cevabımdan bu yana, ne yazık ki fiyatı oldukça arttı, InstallShield ve ilkine kıyasla hala son derece iyi bir değer olsa da ...
Düzenleme: DLL'leriniz GAC'de kayıtlıysa, standart referans etiketlerini bu şekilde de kullanabilirsiniz (örnek olarak 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>
Koşul ayrıca tüm yapı türlerine, sürüm veya hata ayıklamaya indirgenir ve yalnızca işlemci mimarisini belirtir.