2012-11-28 12 views
12

का संदर्भ जोड़ता है मुझे रिलीज मोड में अपनी प्रोजेक्ट बनाने के लिए विजुअल स्टूडियो प्राप्त करने में परेशानी हो रही थी ... यह मुझे असेंबली गलत प्रारूप होने के बारे में त्रुटियां देता है। X64 असेंबली के बजाय कुछ x86 असेंबली का संदर्भ दिया जा रहा है। प्रेजेंटेशनकोर, सिस्टम.डाटा और इसी तरह की असेंबली।विजुअल स्टूडियो 2012 गलत DLL

बातें मैं कोशिश की है:

  • डीबग मोड, किसी भी सीपीयू ठीक बनाता है।

  • डीबग मोड, x64 ठीक बनाता है।

  • रिलीज मोड, किसी भी सीपीयू में विफल रहता है

  • रिलीज मोड, 64 में विफल रहता है (इस संयोजन मैं में अपने प्रोजेक्ट का निर्माण करना चाहते हैं)

मुद्दा आता है जब मैं करने की कोशिश x86 संदर्भ को हटाएं और इसे एक x64 संदर्भ में स्विच करें। विजुअल स्टूडियो सिर्फ x64 संदर्भ के बजाय पुराना x86 संदर्भ जोड़ता है। उदाहरण के लिए:

मैं System.Data संदर्भ जो C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll

मैं करने के लिए ब्राउज़ करें और C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Data.dll जोड़ने के लिए, लेकिन जब मैं कि System.Data संदर्भ पर क्लिक करें में है निकालने के लिए, पथ स्पष्ट रूप से पुराने dll करने के लिए अभी भी है और एक ही त्रुटि होने का कारण बनता है। यह कई अन्य डीएलएल के साथ भी हो रहा है।

क्या कोई इस मुद्दे के समाधान के बारे में जानता है?

उत्तर

18

प्रेजेंटेशनकोर, सिस्टम.डाटा और इसी तरह की असेंबली।

मुझे त्रुटि संदेश को देखे बिना किसी प्रश्न का उत्तर देने से नफरत है। लेकिन यह माध्यमिक सबूत सवाल का जवाब देने के लिए पर्याप्त है। सबसे पहले, यह त्रुटि नहीं है, यह चेतावनी है। यह इस तरह दिखता है:

चेतावनी CS1607: विधानसभा पीढ़ी - संदर्भित विधानसभा 'System.Data.dll' लक्ष्य के लिए एक अलग प्रोसेसर

तुम भी mscorlib.dll के लिए एक देखेंगे। और एक WPF प्रोजेक्ट में PresentationCore.dll। यहां क्या होता है कि ये असेंबली विशेष हैं, वे मिश्रित-मोड असेंबली हैं। दूसरे शब्दों में, उनमें देशी कोड और प्रबंधित कोड दोनों होते हैं। मूल कोड समस्या निर्माता है, ऐसी असेंबली का उपयोग केवल उस प्रोजेक्ट में किया जा सकता है जो सही प्रोसेसर स्वाद को लक्षित करता है।यदि आप इसे मिश्रित करते हैं तो आपको रनटाइम पर BadImageFormatException मिलता है।

यह .NET असेंबली के साथ एक वास्तविक समस्या नहीं है, आपकी मशीन में वास्तव में दो जीएसी में संग्रहीत इन डीएलएल के संस्करण हैं। एक का उपयोग किया जाएगा यदि आपका प्रोग्राम 32-बिट मोड में चलता है और दूसरा जो 64-बिट मोड में उपयोग किया जाता है। सीएलआर स्वचालित रूप से सही चुनता है।

हालांकि, संदर्भ असेंबली का केवल एक संस्करण है, जो सी: \ windows \ microsoft.net में संग्रहीत है और आप मेटाडेटा को पढ़ने के लिए कंपाइलर को पास करते हैं। यह हमेशा x86 संस्करण है, कोई दूसरा नहीं है इसलिए इसे ढूंढने की परेशानी न करें। दोबारा, यह कोई समस्या नहीं है, केवल संदर्भ असेंबली का मेटाडेटा कंपाइलर द्वारा उपयोग किया जाता है, यह इसके किसी भी कोड को निष्पादित नहीं करता है। और मेटाडेटा असेंबली के बिट-नेस पर निर्भर नहीं है।

फिर भी, यह सभी समस्या हो सकती है यदि आप अपनी मिश्रित-मोड असेंबली बनाते हैं। आप आसानी से दो संस्करण प्रदान करने की आवश्यकता को नजरअंदाज कर सकते हैं। तो संकलक क्या परेशान कर रहा है यह है कि यह देखता है कि आपने अपनी परियोजना के किसी भी एसीसीपीयू या एक्स 64 बिल्ड के लिए कहा है। लेकिन पता चलता है कि संदर्भ असेंबली केवल तभी काम कर सकती है जब आप x86 को लक्षित करते हैं। तो यह आपको थोड़ा सा झुकाता है, सिर्फ एक सभ्य अनुस्मारक है कि कुछ सबूत हैं कि आप इसे गलत समझ रहे हैं और जब आप इसे चलाते हैं तो आपका प्रोग्राम BadImageFormatException पर पड़ सकता है। यह अन्यथा आपकी खुद की संदर्भ असेंबली से अलग फ्रेमवर्क संदर्भ असेंबली का इलाज नहीं करता है।

तो, सुविधा, एक बग नहीं है। सिर्फ एक चेतावनी जो आपके प्रोग्राम को भवन से रोकती नहीं है। आप चेतावनी को सुरक्षित रूप से अनदेखा कर सकते हैं क्योंकि जानते हैं कि .NET के पास रनटाइम पर जीएसी में सही असेंबली उपलब्ध है। उल्लेखनीय है कि .NET 4.0 में यह समस्या नहीं है, यह बहुत अलग संदर्भ असेंबली का उपयोग करती है जिनके पास ILONLY मेटाडेटा ध्वज बंद नहीं है।

6

अजीब व्यवहार। प्रोजेक्ट गुणों में बिल्ड के तहत "धारावाहिक असेंबली जेनरेट करें" को चालू करना परियोजना को रिलीज मोड में ठीक बनाता है। this link पर देखकर पता चलता है कि इस सेटिंग को एक्सएमएल सीरियलाइजेशन के साथ करना है, जिसे हम अपने पूरे समाधान में भी उपयोग नहीं करते हैं।

बहुत अजीब। अभी भी इस प्रश्न और व्यवहार के लिए एक स्पष्टीकरण की तलाश है।

1

.NET का कौन सा संस्करण आप संकलित कर रहे हैं? यदि आप परियोजना को .NET ढांचे के बाद के संस्करण में बदल सकते हैं, तो इससे मदद मिल सकती है।

+0

हम .NET 3.5 के खिलाफ संकलित कर रहे हैं। दुर्भाग्यवश, ढांचे को बदलना सवाल से बाहर है। क्या आप विस्तार से सोच सकते हैं कि फ्रेमवर्क बदलने से कोई फर्क पड़ता है? मेरे प्रश्न में डीएलएल उन दो संस्करणों से पूरी तरह से स्वतंत्र है, यह सिर्फ एक अलग प्रोसेसर मंच है। – tnw

+0

प्रोजेक्ट फ़ाइल में मैन्युअल रूप से संदर्भों को बदलने का प्रयास करें, जैसा कि सुझाव दिया गया है [यहां] (http://connect.microsoft.com/VisualStudio/feedback/details/525599/compiling-an-net-plplication-for-x64-platform-on -64-बिट-ओएस-चाहिए-जेनरेट-सीएस 1607-चेतावनी) (माइक्रोसॉफ्ट द्वारा 7/12/2010 को 3:23 बजे पोस्ट किया गया) – Jargon

+0

हाँ, उन्हें सीधे csproj फ़ाइल में बदलना एकमात्र तरीका है हस्तांतरण के संदर्भ प्राप्त करने के लिए। अभी भी यह नहीं समझाता है कि क्यों डीबग बनाम रिलीज का निर्माण नहीं होता है। – tnw

2

देखें कि आपकी बिल्ड कॉन्फ़िगरेशन कैसा दिखता है। कभी-कभी यह त्रुटि होती है क्योंकि किसी समाधान पर कुछ प्रोजेक्ट को एक निर्माण कॉन्फ़िगरेशन में बनाया गया है, न कि किसी अन्य में। "सक्रिय समाधान विन्यास" चालू "विन्यास प्रशासन संकलित करें> ..."

  1. जाएं
  2. "रिलीज़" जो विन्यास है कि आप समस्याओं दे रही है का चयन करें:

    ऐसा करने के लिए।

  3. "सक्रिय समाधान प्लेटफ़ॉर्म" पर "कोई भी CPU" जांचें। यदि "x64" परिभाषित किया गया है, तो आप इसे भी चुन सकते हैं।
  4. बिल्ड परियोजनाओं की सूची देखें। समाधान के लिए आवश्यक सभी परियोजनाओं को "कॉन्फ़िगरेशन", "प्लेटफ़ॉर्म" में सही मानों के साथ चिह्नित किया जाना चाहिए और "संकलन" जांच होनी चाहिए।

मेरे मामले में मेरे पास एक sandcastle प्रोजेक्ट है जो कम से कम डीबग मोड में, ज्यादातर समय अनचेक करता है, क्योंकि इसे संकलन करने में आयु लगती है। कभी-कभी ऐसा होता है कि एक प्रोजेक्ट में "रिलीज" कॉन्फ़िगरेशन के लिए कॉन्फ़िगरेशन नहीं होता है और इस प्रकार, जब निर्माण प्रक्रिया इसके परिणाम प्राप्त करने का प्रयास करती है, तो यह मौजूद नहीं है (कोई DLL नहीं है) और यह अपवाद फेंकता है। अन्य परिस्थितियों में, यह हो सकता है कि एक परियोजना को x86 (या x64) के लिए संकलित करने के लिए मजबूर किया गया हो और बाकी नहीं है, और इसलिए संदर्भित DLL के उचित संस्करण में अन्य संदर्भ परियोजनाओं को जोड़ने का प्रयास करते समय एक त्रुटि फेंक दी गई है।

1

मेरा वीएस -2010 वेब प्रोजेक्ट इन चेतावनियों को भी उत्पन्न कर रहा था, और आईआईएस एक BadImageException फेंक रहा था। बिल्ड/कॉन्फ़िगरेशन/प्लेटफ़ॉर्म सेटिंग्स ठीक लगती थीं, लेकिन आउटपुट विंडो दिखा रही थी कि किसी भी CPU कॉन्फ़िगरेशन के लिए x64 फ़ोल्डर में डीएलएल बनाया गया था। बिन और पुनर्निर्मित के तहत सभी फ़ोल्डरों को हटा दिया गया।चेतावनियां चली गईं और BadImageException चला गया था।

+0

दिलचस्प। अपना समाधान साझा करने के लिए धन्यवाद। – tnw

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