2012-07-24 14 views
5

संभव डुप्लिकेट लिंक:
Loading x86 or x64 assemblyनेट AnyCPU परियोजना मंच विशिष्ट पुस्तकालय

मैं किसी भी सीपीयू नेट परियोजना संकलित करने के लिए कोशिश कर रहा हूँ, लेकिन मैं SQLite पुस्तकालय है जो लिंक करने x86 और x64 प्लेटफ़ॉर्म के लिए अलग-अलग संस्करण। X64 में केवल डीएलएल संस्करणों को बदलने में मदद नहीं होती है, एप्लिकेशन शुरू नहीं होता है, मुझे x64 संदर्भ का उपयोग करके कोड को पुन: संकलित करने की आवश्यकता है। जब मैं दोनों x86 और x64 संदर्भ जोड़ता हूं तो यह विवादों के कारण संकलित करने में विफल रहता है। मैं x86 का उपयोग कर एप्लिकेशन संकलित नहीं कर सकता, क्योंकि सिस्टम COM पुस्तकालयों में से एक मैं WOW64 के तहत काम नहीं करता हूं।

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

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

तो मैं किसी भी सीपीयू परियोजना का निर्माण करने की जरूरत है, लेकिन इस समस्या को मैं इस समय को देखने के लिए एकमात्र समाधान x86 और x64 के लिए डुप्लिकेट परियोजनाओं हो रही है। क्या इससे बेहतर कुछ है?

अद्यतन

जब मैं इस परियोजना में 64 लाइब्रेरियों को संदर्भित है, लेकिन 86 पुस्तकालयों मैं निम्न अपवाद प्राप्त लोड करने के लिए प्रयास करें।

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

+0

धन्यवाद। मैंने इस तरह की पोस्ट देखी है, लेकिन समस्या बदल रही है डीएलएल केवल ज्यादा मदद नहीं करता है। जब भी मैं अपने फ़ोल्डर में 64 बिट डीएलएल की प्रतिलिपि बनाता हूं तब भी यह काम नहीं करता है, मुझे अभी भी उन 64 बिट पुस्तकालयों के संदर्भ में अनुप्रयोग को पुन: संकलित करने की आवश्यकता है। क्या मुझसे कुछ गलत हो रही है? और मैं यह भी नहीं समझता कि मुझे किस संस्करण का संदर्भ देना चाहिए? – axe

+1

हां। देशी पुस्तकालयों में समान नाम होना चाहिए, लेकिन अलग-अलग फ़ोल्डर्स (जैसे आपके ऐप के उपफोल्डर) में स्थित होना चाहिए। रनटाइम पर आप ओएस को गठबंधन के आधार पर सही फ़ोल्डर में देखने के लिए 'SetDllDirectory' कहते हैं। या 'AppDomain.CurrentDomain.AssemblyResolve' ईवेंट का उपयोग करें [रोवर द्वारा सुझाए गए अनुसार] (http://stackoverflow.com/questions/3787428/loading-x86-or-x64-assembly#comment7029800_6060754)। आप सीधे उन पुस्तकालयों का संदर्भ नहीं देते हैं, SQLite प्रबंधित रैपर करता है। आपका कोड रैपर को अंतर्निहित मूल पुस्तकालय का सही संस्करण लोड करेगा। – GSerg

+0

मैंने इसे एक बार फिर कोशिश की, यह मेरे लिए काम नहीं करता है। आवेदन शुरू पर दुर्घटनाग्रस्त हो जाता है। समस्या यह है कि मैं प्रोजेक्ट में x64 पुस्तकालयों का संदर्भ दे रहा हूं, लेकिन मैं रनटाइम पर x86 लाइब्रेरी का चयन करता हूं। यदि मैं x86 पुस्तकालयों का उपयोग करके अपना आवेदन बनाता हूं तो यह पूरी तरह से x86 विंडो पर काम करता है, अन्यथा यह नहीं करता है। – axe

उत्तर

6

मुख्य समस्या यह है कि मैं 86 और 64 के लिए SQLite के विभिन्न संस्करणों का उपयोग कर रहा था। मैं विधि

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); 
} 

और सेट ईवेंट हैंडलर

AppDomain.CurrentDomain.AssemblyResolve += SQLitePlatformSpecificResolve; 

मुख्य आवेदन प्रवेश बिंदु में जोड़ा। अब यह x86 प्लेटफ़ॉर्म के लिए x86 असेंबली लोड करता है और x64 64 बिट प्लेटफ़ॉर्म पर संगत रूप से लोड करता है।

धन्यवाद।

संबंधित मुद्दे