2012-07-24 14 views
5

Olası Çoğalt bağlantılar: Ben herhangi bir CPU .NET projeyi derlemek çalışıyorum
Loading x86 or x64 assembly.NET AnyCPU proje platforma özel kütüphaneye

ama sahiptir SQLite kütüphanesini bağlamak zorunda x86 ve x64 platformları için farklı versiyonlar. X64'e yalnızca DLL sürümlerini değiştirme yardımcı olmuyor, uygulama başlamıyor, x64 referansını kullanarak kodları yeniden derlemem gerekiyor. Hem x86 hem de x64 referanslarını eklediğimde, çakışma nedeniyle derleme başarısız oluyor. x86 kullanarak uygulamayı derleyemiyorum çünkü kullandığım sistem COM kitaplıklarından biri WOW64 altında çalışmıyor.

http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/eadf5dcd-fbd1-4224-9a56-b5843efebb15/

All 32-bit VSS applications (requesters, providers, and writers) must run as native 32-bit or 64-bit applications. Running them under WOW64 is not supported

yüzden Herhangi bir CPU projesini inşa etmek gerekir, ama şu an gördüğüm bu sorunun tek çözüm x86 ve x64 için mükerrer projeleri yaşıyor. Daha iyi bir şey var mı?

GÜNCELLEME

ben projede x64 kitaplıklarına referans fakat x86 kütüphaneleri aşağıdaki özel durum almak yüklemeyi deneyin.

The located assembly's manifest definition does not match the assembly reference.

+0

Teşekkürler. Bunun gibi yayınlar gördüm, ancak sorun sadece DLL'yi değiştirmiyor. Hala 64 bit DLL'leri klasörüme kopyaladığımda işe yaramıyor, yine de bu 64 bit kitaplıklara başvurmayı yeniden derlemem gerekiyor. Yanlış bir şey mi yapıyorum? Ayrıca hangi sürüme başvurmam gerektiğini de anlamıyorum? – axe

+1

Evet. Yerel kitaplıklar aynı ada sahip olmalıdır, ancak farklı klasörlerde (uygulamanızın alt klasörleri gibi) bulunmalıdır. Çalışma zamanında, OS'nin bititeye bağlı olarak doğru klasöre bakmasını sağlamak için 'SetDllDirectory' öğesini çağırırsınız. Ya da "AppDomain.CurrentDomain.AssemblyResolve" olayını [Rover tarafından önerilen] olarak kullanın (http://stackoverflow.com/questions/3787428/loading-x86-or-x64-assembly#comment7029800_6060754). Bu kitaplıkları doğrudan referans almazsınız, SQLite yönetilen sarıcı yapar. Kodunuz, sargının alttaki ana kitaplığın doğru sürümünü yüklemesini sağlayacaktır. – GSerg

+0

Bir kez daha denedim, benim için çalışmıyor. Uygulama başlangıçta çöküyor. Sorun şu ki, x64 kitaplıklarını projeye gönderme yapıyorum, ancak çalışma zamanında x86 kitaplıklarını seçiyorum. X86 kitaplıklarını kullanarak uygulamamı yaparsam, x86 pencerelerinde mükemmel çalışır, aksi halde olmaz. – axe

cevap

6

temel sorun ben x86 ve x64 için SQLite farklı sürümlerini kullanan gerçeği idi. bir yöntem

static private Assembly SQLitePlatformSpecificResolve(object sender, ResolveEventArgs args) 
{ 
    string platform = Environment.Is64BitProcess ? "x64" : "x86"; 
    string assemblyName = new AssemblyName(args.Name).Name; 
    string assemblyPath = Path.Combine(
     Environment.CurrentDirectory, "SQLite", platform, assemblyName + ".dll"); 

    return !File.Exists(assemblyPath) ? null : Assembly.LoadFrom(assemblyPath); 
} 

ve ana uygulama giriş noktası ayarlanır olay gidericisini

AppDomain.CurrentDomain.AssemblyResolve += SQLitePlatformSpecificResolve; 

ilave edildi. Artık x86 platformları için x86 montajını ve 64 bit platformlarda x64'ü yükler.

Teşekkürler.

İlgili konular