2010-07-21 9 views
35

विजुअल स्टूडियो 2008 ने ए असेंबली B से एक असेंबली A को संदर्भित करने दिया था जब ए लक्ष्यीकरण कर रहा था .NET 3.5 और B .NET 2.0 को लक्षित कर रहा था।विजुअल स्टूडियो 2010: उच्च फ्रेमवर्क संस्करण को लक्षित करने वाली संदर्भ असेंबली

विजुअल स्टूडियो 2010 यह किसी भी अधिक के लिए अनुमति नहीं है। पूर्ण मुद्दा MSDN पर वर्णित है:

आप अनुप्रयोगों बना सकते हैं कि संदर्भ परियोजनाओं या विधानसभाओं जो .NET फ्रेमवर्क के लक्ष्य विभिन्न संस्करणों। उदाहरण के लिए, आप एक आवेदन जो .NET फ्रेमवर्क 4 ग्राहकों का प्रोफाइल लक्षित करता है, परियोजना एक विधानसभा संदर्भित कर सकते हैं कि बनाते हैं कि लक्ष्य .नेट फ्रेमवर्क संस्करण 2.0। हालांकि, अगर आप एक परियोजना है कि लक्ष्य नेट फ्रेमवर्क के पिछले संस्करण, आप एक परियोजना या विधानसभा जो .NET फ्रेमवर्क 4 ग्राहकों का प्रोफाइल या लक्षित करता है कि परियोजना में एक संदर्भ सेट नहीं कर सकता बनाते हैं। नेट फ्रेमवर्क 4। त्रुटि को खत्म करने के लिए, सुनिश्चित करें कि द्वारा लक्षित प्रोफ़ाइल परियोजनाओं द्वारा लक्षित प्रोफ़ाइल या आपके एप्लिकेशन द्वारा संदर्भित असेंबली के साथ संगत है।

क्या कोई तरीका है कि मैं इस संबंध में वीएस -2010 की तरह व्यवहार करने के लिए वीएस -2010 प्राप्त कर सकता हूं (यानी उच्च ढांचे के संस्करणों को लक्षित करने वाले असेंबली के संदर्भों की अनुमति देता है)?

मैं VS 2010 व्यवहार और तैनाती विचार मैं के बारे में पता करने की आवश्यकता है के पीछे तर्क पता है, दोहराने की जरूरत है।

सटीक त्रुटि है:

चेतावनी MSB3268: प्राथमिक संदर्भ "xxx.dll" हल नहीं किया जा सका क्योंकि यह ढांचे विधानसभा पर एक अप्रत्यक्ष निर्भरता है "System.Core, संस्करण = 3.5.0.0, संस्कृति = तटस्थ, PublicKeyToken = b77a5c561934e089 "जो वर्तमान में लक्षित ढांचे में हल नहीं किया जा सकता है। ".NETFramework, संस्करण = v2.0"। इस समस्या को हल, या तो संदर्भ "xxx.dll" हटाने या एक ढांचा संस्करण जो "System.Core होता है, संस्करण = 3.5.0.0, संस्कृति = तटस्थ करने के लिए अपने आवेदन तरीके से पुनः करने के लिए, PublicKeyToken = b77a5c561934e089 "।

+2

मैं थोड़ी देर में हूं कि आप ऐसा क्यों करना चाहते हैं। पूरे ऐप को फिर भी शुरू करने के लिए ढांचे के उच्च संस्करण की आवश्यकता नहीं होगी? इस मामले में, क्या यह चारों ओर उच्च संस्करण को लक्षित करने के लिए समझ में नहीं आता है? – cHao

+2

व्याख्या करना मुश्किल है लेकिन इसके पीछे एक उचित आवश्यकता है। –

+3

उचित आवश्यकता: 2.0 एएसपी.NET साइट और 3.5 WinForms ऐप द्वारा साझा व्यवसाय तर्क असेंबली ("बीएल")। वेबसाइट पुराने एंटरप्राइज़ लाइब्रेरी 3.1 का उपयोग करती है और WinForms ऐप नए EntLib 5.0 का उपयोग करता है।WinForms के लिए निर्माण करते समय, बीएल को नए एंटीलिब के संदर्भों को स्विच करने की आवश्यकता होती है, जो कि 3.5 हैं, लेकिन बीएल को अभी भी 2.0 प्रोजेक्ट के साथ काम करने के लिए एक 2.0 प्रोजेक्ट होना चाहिए। VS2008 ने इसे कॉन्फ़िगरेशन स्विच करके होने की अनुमति दी, लेकिन वीएस -2010 उपरोक्त त्रुटि को फेंकता है क्योंकि एंटीलिब 5.0 3.5 संदर्भों (विशेष रूप से, System.Core) की अपेक्षा कर रहा है। –

उत्तर

44

Step1: अनलोड संदर्भित परियोजना .NET 2.0

चरण 2 को लक्षित: सही उतार परियोजना क्लिक करें और संदर्भ मेनू

चरण 3 से संपादित करें का चयन करें: <SpecificVersion>true</SpecificVersion> संदर्भ में जोड़े। नीचे मेरे रेपो समाधान से एक नमूना है:

<ProjectReference Include="..\HighFX\HighFX.csproj"> 
    <Project>{8DD71CAF-BEF7-40ED-9DD0-25033CD8009D}</Project> 
    <Name>HighFX</Name> 
    <SpecificVersion>true</SpecificVersion> 
</ProjectReference> 

चरण 4: प्रोजेक्ट को दोबारा लोड करें।

अब आप विजुअल स्टूडियो 2010 के भीतर निर्माण करने में सक्षम होना चाहिए, फिर भी नीचे एक चेतावनी हो सकती है, लेकिन निर्माण सफल हो सकता है।

स्रोत: http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/dfadfb34-5328-4c53-8274-931c6ae00836

+0

एक आकर्षण की तरह काम किया! धन्यवाद :-)!! – Muhammedh

+0

फ्रेकिंग शानदार। यही वह है जिसे मैं SO पर एक उपयोगी उत्तर कहता हूं। धन्यवाद!! – Jawad

+0

यह मेरे लिए भी काम किया। हमारे पास वीएस 2015 या वीएस 2017 के विभिन्न संस्करणों का उपयोग करने वाले कुछ लोग हैं। क्या यह प्रविष्टि वीएस 15 के उपयोगकर्ताओं को प्रभावित करेगी? – Rod

20

.NET फ्रेमवर्क संस्करण संख्या 2.0 के बाद एक गड़बड़ हो गई। एक विधानसभा नहीं लक्ष्य एक .NET ढांचा संस्करण करता है, यह एक CLR संस्करण निशाना बनाता है। और फ्रेमवर्क संस्करण 2.0, 3.0, और 3.5 के लिए सीएलआर संस्करण समान था, 2.0.50727।

यही कारण है कि देखा गया जैसा कि आप VS2008 में संस्करणों को मिश्रित कर सकते हैं। लेकिन आप एक असेंबली के [असेंबलीवर्सन] को देख रहे थे, जिसका सीएलआर संस्करण से कोई लेना देना नहीं है।दुर्भाग्यवश, सीएलआर संस्करण प्रॉपर्टी विंडो में दिखाई नहीं दे रहा है, आपको इसे मेटाडाटा में देखने के लिए Ildasm.exe को चलाने की आवश्यकता होगी। लेकिन आप सुरक्षित रूप से मान सकते हैं कि 2.0.0.0 और 3.5.0.0 लक्ष्य सीएलआर संस्करण 2.0.50727

के साथ कोई भी असेंबली संस्करण .NET 4.0 के साथ समाप्त हुआ, इसे एक नया सीएलआर संस्करण, 4.0.3031 9 मिला। एमएसडीएन ब्लर्ब आपको क्या बता रहा है कि जब आप सीएलआर संस्करण 2.0 को लक्षित करते हैं तो आप 4.0 को लक्षित करने वाली असेंबली का उपयोग नहीं कर सकते हैं। संस्करण 2.0 सीएलआर नहीं जानता कि .NET 4.0 असेंबली के मेटाडेटा को कैसे पढ़ा जाए, प्रारूप बदल दिया गया था। एकमात्र कामकाज बल सीएलआर के 4.0 संस्करण को लोड करने के लिए EXE है, भले ही यह 2.0.50727 के लिए पूछता है। आपको लगता है कि एक app.exe.config फ़ाइल के साथ, यह इस तरह दिखना चाहिए कार्य करें:

<configuration> 
    <startup> 
    <supportedRuntime version="v4.0"/> 
    </startup> 
</configuration> 

और परीक्षण का एक सा है कि यह अभी भी सही ढंग से काम करता है, माइक्रोसॉफ्ट v4.0 इस्तेमाल किया 2.0 कि नहीं कर सके में कई वर्ष कीड़े तय करने के लिए छोटी गाड़ी के व्यवहार पर निर्भर पुराने कोड को तोड़ने का जोखिम उठाए बिना आसानी से तय किया जा सकता है।

+1

मुझे पता है, और यही कारण है कि मैं सोच रहा हूं कि यह अब और काम नहीं करता है। मेरी कोई भी परियोजना 4.0 परियोजना नहीं है लेकिन 3.5 परियोजनाओं के संदर्भ में 2.0 परियोजनाएं हैं (जिन्हें ठीक काम करना चाहिए)। –

+0

मैंने आपको अपने प्रश्न में किसी प्रकार का त्रुटि संदेश नहीं देखा है। उस संदेश के बिना आपकी मदद नहीं कर सकता। –

+0

@ हंस: जांच के लिए धन्यवाद, मैंने प्रासंगिक त्रुटि संदेश शामिल किया है। –

6
Add <SpecificVersion>true</SpecificVersion> to the reference 

एक दूसरे को संदर्भित कई परियोजनाओं के साथ एक बड़ा समाधान में, यह एक व्यापक प्रभाव है, जो एक दर्द मैन्युअल रूप से ठीक करने के लिए है हो सकता था। प्रक्रिया को स्वचालित करने के लिए, मैंने नीचे पावरशेल स्क्रिप्ट लिखी है। इसे अपने समाधान के शीर्ष स्तर पर चलाएं - स्क्रिप्ट .csproj फ़ाइलों के लिए रिकर्सली की खोज करती है और आंशिक GUID (जो आपको स्क्रिप्ट की प्रासंगिक पंक्ति संपादित करके निर्दिष्ट करना चाहिए) से मेल खाने वाले तत्वों को अद्यतन करता है। (डिफ़ॉल्ट टैब)

dir -recurse -filter *.csproj | foreach { 
    $xml = New-Object XML 

    $xml.Load($_.FullName) 

    # we want the ItemGroup that contains the references 
    $itemgroup = $xml.Project.ItemGroup | where { $_.ProjectReference } 
    # Project GUIDs to search for... (edit as needed for your projects) 
    $projrefs = $itemgroup.ProjectReference ` 
     | where { !$_.SpecificVersion ` 
      -and ($_.Project -like "*CF2185B1*" ` 
       -or $_.Project -like "*CF2185B2*" ` 
       -or $_.Project -like "*CF2185B3*") ` 
     } 

    if ($projrefs) { 
     Write-Host $_.FullName 

     foreach($ref in $projrefs) { 
      if($ref) { 
       # <specificversion>true</specificversion> 
       $el = $xml.CreateElement("SpecificVersion", $xml.Project.xmlns) 
       $el.InnerText = "true" 
       $ref.AppendChild($el) | out-null 
       Write-Host " updated: " $ref.Name 
      } 
     } 

     $xml.Save($_.FullName) 
    } 
} 

Write-Host "Press any key to continue ..." 
$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 
1

कृपया, विजुअल स्टूडियो 2015

  1. सबसे पहले करने के लिए जाना अपनी परियोजना पर दायाँ क्लिक करके के साथ आगे बढ़ें
  2. का चयन करें प्रोजेक्ट गुण
  3. आवेदन टैब का चयन करें
  4. उस विशिष्ट प्रोजेक्ट के लिए वांछित ढांचे में लक्ष्य फ्रेमवर्क बदलें। Image for this process is shown here
संबंधित मुद्दे