2011-01-18 21 views
5

Ürünümüz bir C++ projesine dayanmaktadır, ancak şimdi ön uç için C# projeleri kullanıyoruz. Şimdi de 64 bit versiyonu yapıyoruz.
Planımız, tüm C# dlls'lerini AnyCPU olarak oluşturmaktır. C# projeleri, ortak bir bin klasöründeki C++ dll'lerine başvuruda bulunacaktır. X64 binasında bin klasörü C++ dlls'imizin x64 versiyonlarını içerecek ve Win32 binaryum dosyası oluştururken C++ dlls'inin 32 bit sürümlerini içerecektir. Bu yüzden C# projeleri AnyCPU'yu oluşturacak, ancak x64 veya Win32 C++ dll'i içerecek.
Sorum şu, bu iş mi? Çalışma zamanında, çalıştırdığımız exe'ye göre 32 veya 64'ün tamamı olmalı, ancak platforma özel bir dll içeren AnyCPU'yu hedefleyen bir projeyi zamanla derleyebiliriz? Yoksa tüm C# dlls'imizin platforma özel versiyonlarını yapmalı mıyız? TeşekkürlerC# AnyCPU projesi bir platforma özel dll içerebilir

cevap

3

Hatırladığım kadarıyla, bu işler.

Sadece 32bit DLL'im vardı, C# derlenmiş ve açılışta çöktü. Yani 64bit DLL koyarsanız, C# yeniden derlemeniz gerekmez sanırım.

2

Yaptım. Derleme uyarıları vermesine rağmen.

2

Çalışmalı, geçmişte böyle bir yaklaşım kullandım ve iyi çalışıyor. ne tür derleme uyarıları alırsınız?

8

Bu, öncelikli olarak, doğru işletim sistemi için doğru DLL'leri seçerek bir dağıtım sorunudur. İki kurulum projesi oluşturursanız, x86 için bir diğeri x64 için bir diğeri ise oldukça basittir. Saydam bir şekilde çalışmak da mümkündür. EXE'inizi içeren dizinde bir x86 ve bir x64 alt dizini oluşturup, bu alt dizinlerdeki DLL'lerin sırasıyla 32 bit ve 64 bit yapılarını oluşturursunuz. Başlangıçta, sürecinizin bitini öğrenmek için IntPtr.Size'yi işaretleyin. Ardından, Windows'un doğru DLL dosyasını bulabilmesi için buna göre SetDllDirectory komutunu pinvoke edin. Şunun gibi:

using System.Runtime.InteropServices; 
using System.Reflection; 
using System.IO; 
... 
     public static void SetupDllDirectory() { 
      string path = Assembly.GetEntryAssembly().Location; 
      path = Path.Combine(path, IntPtr.Size == 8 ? "x64" : "x86"); 
      bool ok = SetDllDirectory(path); 
      if (!ok) throw new System.ComponentModel.Win32Exception(); 
     } 

     [DllImport("kernel32.dll", SetLastError = true)] 
     private static extern bool SetDllDirectory(string path); 

dll kopyalamak için bir post inşa olayı kullanın. Dizini PATH ortam değişkenine eklemek için Environment.SetEnvironmentVariable() öğesini kullanmak başka bir yaklaşımdır.