.net मैं विजुअल स्टूडियो संकलन त्रुटि को कैसे ठीक करूं, "प्रोसेसर आर्किटेक्चर के बीच मेल नहीं खाता"?




visual-studio (15)

मैं विजुअल स्टूडियो 2010 में प्रोजेक्ट कॉन्फ़िगरेशन के लिए नया हूं, लेकिन मैंने कुछ research और अभी भी इस मुद्दे को काफी समझ नहीं सकता है। मेरे पास सी # डीएलएल संदर्भित सी ++ डीएलएल के साथ एक विजुअल स्टूडियो समाधान है। सी # डीएलएल कुछ अन्य डीएलएल का संदर्भ देता है, कुछ मेरी परियोजना के भीतर और कुछ बाहरी। जब मैं सी ++ डीएलएल संकलित करने का प्रयास करता हूं, तो मुझे यह चेतावनी मिलती है:

एमएसबी 3270 चेतावनी: परियोजना के प्रोसेसर आर्किटेक्चर "एमएसआईएल" और "[आंतरिक सी # डीएलएल]", "x86" के प्रोसेसर आर्किटेक्चर के बीच एक विसंगति थी।

यह मुझे मेरे आर्किटेक्चर को संरेखित करने के लिए कॉन्फ़िगरेशन प्रबंधक पर जाने के लिए कहता है। सी # डीएलएल प्लेटफार्म लक्ष्य x86 के साथ स्थापित है। अगर मैं इसे किसी अन्य सीपीयू की तरह बदलने की कोशिश करता हूं, तो यह किसी भी सीपीयू की तरह शिकायत करता है क्योंकि बाहरी डीएलएल में से एक प्लेटफ़ॉर्म लक्ष्य x86 पर निर्भर करता है।

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

मुझसे यहां क्या गलत हो रहा है?



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

मेरा समाधान * .csproj फ़ाइलों को मैन्युअल रूप से संपादित करना है ताकि इन जैसे लाइनें:

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=x86"/>

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=AMD64"/>

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"/>

इसमें बदल जाओ:

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral"/>

मुझे वही चेतावनी मिल रही थी जो मैंने किया था:

  1. अनलोड परियोजना
  2. परियोजना गुणों यानी .csproj संपादित करें
  3. निम्नलिखित टैग जोड़ें:

    <PropertyGroup>
        <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
            None
        </ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
    </PropertyGroup>
    
  4. परियोजना को फिर से लोड करें


यदि आपके सी # डीएलएल में x86- आधारित निर्भरता है, तो आपका डीएलएल स्वयं x86 होना होगा। मैं वास्तव में उस के आसपास एक रास्ता नहीं देखता हूँ। वीएस इसे बदलने के बारे में शिकायत करता है (उदाहरण के लिए) x64 क्योंकि 64-बिट निष्पादन योग्य 32-बिट पुस्तकालय लोड नहीं कर सकता है।

मैं सी ++ प्रोजेक्ट की कॉन्फ़िगरेशन के बारे में थोड़ा उलझन में हूं। निर्माण के लिए प्रदान किया गया चेतावनी संदेश सुझाव देता है कि इसे किसी भी सीसीपीयू के लिए लक्षित किया गया था, क्योंकि यह उस प्लेटफॉर्म की सूचना देता है जिसे लक्षित किया गया था [MSIL], लेकिन आपने संकेत दिया कि परियोजना के लिए कॉन्फ़िगरेशन वास्तव में Win32 था। एक मूल Win32 ऐप में एमएसआईएल शामिल नहीं होना चाहिए - हालांकि सीएलआर समर्थन सक्षम होने की संभावना है यदि यह सी # लाइब्रेरी के साथ बातचीत कर रहा है। तो मुझे लगता है कि सूचना पक्ष पर कुछ अंतराल हैं।

क्या मैं सम्मानपूर्वक उनसे समीक्षा कर सकता हूं और परियोजनाओं की सटीक विन्यास के बारे में थोड़ा और विस्तार कर सकता हूं और वे कैसे जुड़े हुए हैं? यदि संभव हो तो आगे की मदद करने में प्रसन्न रहें।


यह एक बहुत ही जिद्दी चेतावनी है और यह एक वैध चेतावनी है, जबकि कुछ ऐसे मामले हैं जहां इसे तृतीय पक्ष घटकों और अन्य कारणों के उपयोग के कारण हल नहीं किया जा सकता है। मेरे पास एक समान समस्या है सिवाय इसके कि चेतावनी इसलिए है क्योंकि मेरी परियोजना प्लेटफॉर्म एएनसीपीयू है और मैं एएमडी 64 के लिए निर्मित एमएस लाइब्रेरी का संदर्भ दे रहा हूं। यह विजुअल स्टूडियो 2010 में है, और वीएस2012 और नेट 4.5 स्थापित करके पेश किया जा रहा है।

चूंकि मैं एमएस लाइब्रेरी को बदल नहीं सकता हूं, मैं संदर्भित कर रहा हूं, और जब से मुझे पता है कि मेरा लक्ष्य परिनियोजन वातावरण केवल 64-बिट होगा, मैं इस मुद्दे को सुरक्षित रूप से अनदेखा कर सकता हूं।

चेतावनी के बारे में क्या? माइक्रोसॉफ्ट ने कनेक्ट रिपोर्ट के जवाब में पोस्ट किया कि एक विकल्प उस चेतावनी को अक्षम करना है। आपको केवल यह करना चाहिए कि आप अपने समाधान वास्तुकला से बहुत अवगत हैं और आप अपने परिनियोजन लक्ष्य को पूरी तरह से समझते हैं और जानते हैं कि यह वास्तव में विकास पर्यावरण के बाहर एक मुद्दा नहीं है।

आप अपनी प्रोजेक्ट फ़ाइल को संपादित कर सकते हैं और चेतावनी को अक्षम करने के लिए इस प्रॉपर्टी समूह और सेटिंग को जोड़ सकते हैं:

<PropertyGroup>
  <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
</PropertyGroup>

ऐसा लगता है कि यह चेतावनी नए विजुअल स्टूडियो 11 बीटा और .NET 4.5 के साथ पेश की गई है, हालांकि मुझे लगता है कि यह पहले संभव हो सकता है।

सबसे पहले, यह वास्तव में सिर्फ एक चेतावनी है। अगर आप सिर्फ x86 निर्भरताओं से निपट रहे हैं तो इससे कुछ भी नुकसान नहीं पहुंचाएगा। माइक्रोसॉफ्ट सिर्फ आपको चेतावनी देने का प्रयास कर रहा है जब आप कहते हैं कि आपकी परियोजना "किसी भी सीपीयू" के साथ संगत है लेकिन आपके पास एक प्रोजेक्ट या डीएल असेंबली पर निर्भरता है जो या तो x86 या x64 है। चूंकि आपके पास x86 निर्भरता है, इसलिए तकनीकी रूप से आपकी परियोजना "कोई भी CPU" संगत नहीं है। चेतावनी को दूर करने के लिए, आपको वास्तव में अपनी परियोजना को "किसी भी CPU" से "x86" में बदलना चाहिए। यह करना बहुत आसान है, यहां चरण हैं।

  1. बिल्ड | कॉन्फ़िगरेशन प्रबंधक मेनू आइटम पर जाएं।
  2. प्लेटफ़ॉर्म के तहत सूची में अपनी प्रोजेक्ट पाएं, यह "कोई भी CPU" कहेंगे
  3. ड्रॉप डाउन से "कोई भी CPU" विकल्प चुनें और फिर <New..>
  4. उस संवाद से, "नया प्लेटफ़ॉर्म" ड्रॉप डाउन से x86 का चयन करें और सुनिश्चित करें कि "कोई भी सीपीयू" चयनित है "ड्रॉप सेटिंग्स से" ड्रॉप डाउन में।
  5. ठीक मारा
  6. आप डीबग और रिलीज कॉन्फ़िगरेशन दोनों के लिए x86 का चयन करना चाहेंगे।

यह चेतावनी को दूर कर देगा और यह भी बताएगा कि आपकी असेंबली या प्रोजेक्ट अब "कोई भी CPU" संगत नहीं है लेकिन अब x86 विशिष्ट है। यह तब भी लागू होता है जब आप 64 बिट प्रोजेक्ट बना रहे हों जिसमें x64 निर्भरता हो; आप इसके बजाय x64 का चयन करेंगे।

एक अन्य नोट, परियोजनाएं "कोई भी सीपीयू" संगत हो सकती हैं आमतौर पर अगर वे शुद्ध .NET परियोजनाएं हैं। यह समस्या केवल तभी आती है जब आप एक निर्भरता (तृतीय पक्ष डीएल या अपनी स्वयं की सी ++ प्रबंधित परियोजना) पेश करते हैं जो एक विशिष्ट प्रोसेसर आर्किटेक्चर को लक्षित करता है।


SQL Server 2012 SP1 SSIS पाइपलाइन स्क्रिप्ट कार्य संकलित करते समय मुझे विजुअल स्टूडियो 2012 में यह चेतावनी मिली - जब तक कि मैंने SQL Server 2012 SP2 स्थापित नहीं किया।


मेरे निर्माण में मुझे बहुत ही समान चेतावनी थी। मेरी परियोजनाओं को .NET 4.5 को लक्षित करने के लिए सेट किया गया था, बिल्ड सर्वर पर विंडोज 8.1 एसडीके (.NET 4.5.1 के लिए) स्थापित किया गया था। .NET 4.5.1 को लक्षित करने के लिए मेरी परियोजनाओं को अपडेट करने के बाद (मेरे लिए कोई समस्या नहीं थी, पूरी तरह से नए एप्लिकेशन के लिए था), मुझे अब चेतावनी नहीं मिली ...


.NET EXE / DLL AnyCPU बनाने के लिए एक तरीका होना चाहिए, और किसी भी अप्रबंधित DLLs यह x86 और x64 दोनों के साथ संकलित पर निर्भर करता है, दोनों अलग-अलग फ़ाइल नामों के साथ बंडल किए गए हैं और फिर .NET मॉड्यूल गतिशील रूप से अपने रनटाइम के आधार पर सही लोड कर रहा है प्रोसेसर वास्तुकला। यह AnyCPU शक्तिशाली बना देगा। यदि सी ++ डीएलएल केवल x86 या x64 का समर्थन करता है तो कोई भीCPU निश्चित रूप से व्यर्थ है। लेकिन दोनों विचारों को बंडल करने के लिए मैंने अभी तक कॉन्फ़िगरेशन मैनेजर के रूप में लागू नहीं किया है, एक ही प्रोजेक्ट को दोबारा एक अलग कॉन्फ़िगरेशन / प्लेटफॉर्म के साथ दोबारा बनाने के साधनों को भी प्रदान नहीं करता है, जिससे किसी भी कॉन्फ़िगरेशन की तरह किसी भी कॉन्फ़िगरेशन की अनुमति हो सकती है।


मुझे आज यह समस्या थी और केवल विजुअल स्टूडियो में बिल्डिंग कॉन्फ़िगरेशन की तलाश में मदद नहीं कर रही थी क्योंकि यह दोनों परियोजनाओं के लिए कोई सीपीयू दिखाती थी जो इमारत नहीं थी और संदर्भित परियोजना थी।

मैंने फिर संदर्भित परियोजना के csproj में देखा और यह पाया:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x64</PlatformTarget>

किसी भी तरह यह प्लेटफार्म लक्ष्य एक कॉन्फ़िगरेशन परिवर्तन के बीच में जोड़ा गया था और आईडीई इसे नहीं देख रहा था।

संदर्भित परियोजना से इस लाइन को हटाने से मेरी समस्या हल हो गई।


सी # डीएलएल प्लेटफार्म लक्ष्य x86 के साथ स्थापित है

कौन सी समस्या है, एक डीएलएल वास्तव में यह चुनने के लिए नहीं मिलता है कि प्रक्रिया का क्या खतरा होगा। यह पूरी तरह से EXE प्रोजेक्ट द्वारा निर्धारित किया गया है, यह पहली असेंबली है जो लोड हो जाती है, इसलिए इसकी प्लेटफ़ॉर्म लक्ष्य सेटिंग वह है जो प्रक्रिया के लिए गठबंधन को निर्धारित करती है और सेट करती है।

डीएलएल के पास कोई विकल्प नहीं है, उन्हें प्रक्रिया के साथ संगत होने की आवश्यकता है। यदि वे नहीं हैं तो आप BadImageFormatException के साथ एक बड़ा Kaboom प्राप्त करेंगे जब आपका कोड उनका उपयोग करने का प्रयास करता है।

तो डीएलएल के लिए एक अच्छा चयन AnyCPU है इसलिए वे किसी भी तरह से काम करते हैं। इससे सी # डीएलएल के लिए बहुत सारी समझ होती है, वे किसी भी तरह से काम करते हैं। लेकिन निश्चित रूप से, आपके सी ++ / सीएलआई मिश्रित मोड डीएलएल नहीं, इसमें अप्रबंधित कोड है जो प्रक्रिया केवल 32-बिट मोड में चलने पर अच्छी तरह से काम कर सकती है। आप इसके बारे में चेतावनियां उत्पन्न करने के लिए बिल्ड सिस्टम प्राप्त कर सकते हैं। जो आपको मिला वह ठीक है। बस चेतावनियां, यह अभी भी ठीक से बनाता है।

बस समस्या का शिकार करें। EXE प्रोजेक्ट के प्लेटफ़ॉर्म लक्ष्य को x86 पर सेट करें, यह किसी भी अन्य सेटिंग के साथ काम नहीं करेगा। और बस सभी डीएलएल परियोजनाओं को AnyCPU पर रखें।


अंगूठे का एक अच्छा नियम "खुले डीएलएल, बंद EXEs" है, जो है:

  • EXE x86 या x64 निर्दिष्ट करके ओएस को लक्षित करता है।
  • डीएलएल खुले रह गए हैं (यानि, एसीसीपीयू) ताकि उन्हें 32-बिट या 64-बिट प्रक्रिया में तुरंत चालू किया जा सके।

जब आप किसी भी ईसीईयू के रूप में EXE बनाते हैं, तो आप जो भी कर रहे हैं, उस पर निर्णय लेना है कि ओएस को किस प्रक्रिया का उपयोग करना है, जो जेईटी को अपनी पसंद के लिए जेईटी करेगा। यही है, एक x64 ओएस 64-बिट प्रक्रिया बनाएगा, एक x86 ओएस 32-बिट प्रक्रिया बनाएगा।

डीएलएल का निर्माण किसी भी सीसीपीयू के रूप में उन्हें किसी भी प्रक्रिया के अनुकूल बनाता है।

असेंबली लोडिंग के subtleties पर अधिक के लिए, here देखें। कार्यकारी सारांश कुछ इस तरह पढ़ता है:

  • किसी भीCPU - invoking प्रक्रिया के आधार पर x64 या x86 असेंबली के रूप में लोड करता है
  • x86 - x86 असेंबली के रूप में लोड; एक x64 प्रक्रिया से लोड नहीं होगा
  • x64 - x64 असेंबली के रूप में लोड; एक x86 प्रक्रिया से लोड नहीं होगा

मैंने इस चेतावनी को रिलीज करने के लिए "कॉन्फ़िगरेशन प्रबंधक" को बदल दिया (मिश्रित प्लेटफार्म)।


मुझे एमएस यूनिट टेस्ट डीएलएल के कारण इसी तरह की समस्या थी। मेरा डब्ल्यूपीएफ एप्लीकेशन x86 के रूप में संकलित किया गया था लेकिन इकाई परीक्षण डीएलएल (संदर्भित EXE फ़ाइल) "कोई भी CPU" के रूप में। मैंने यूनिट टेस्ट डीएलएल को x86 (EXE के समान) के लिए संकलित करने के लिए बदल दिया और इसे पुनर्स्थापित किया गया।


डेविड सैक के जवाब के अतिरिक्त, आपको Project Properties के Build टैब पर भी जाना होगा और Project Properties के लिए Platform Target को x86 सेट करना होगा जो आपको ये चेतावनियां दे रहा है। यद्यपि आप इसकी अपेक्षा कर सकते हैं, यह सेटिंग कॉन्फ़िगरेशन प्रबंधक में सेटिंग के साथ पूरी तरह सिंक्रनाइज़ नहीं होती है।





visual-studio