2017-10-16 34 views
8

मैं एक csproj फ़ाइल में निम्न कोड है:<TargetFramework> और <RuntimeFrameworkVersion> के बीच क्या अंतर है?

<TargetFramework>netcoreapp1.0</TargetFramework>

NuGet पैकेज प्रबंधक में, यह कहता है कि मैं Microsoft.NETCore.App संस्करण है 1.0.5

अब कहते हैं कि सुविधा देता है

<TargetFramework>netcoreapp1.0</TargetFramework> <RuntimeFrameworkVersion>1.1.4</RuntimeFrameworkVersion>

: मैं एक ही csproj फ़ाइल में निम्न कोड है

NuGet पैकेज प्रबंधक अब कहेंगे मैं Microsoft.NETCore.App संस्करण 1.1.4

मैं अनिवार्य रूप से (कुछ एफई मुद्दों कर जब मैं परिवर्तित .NETCore 2.0 से पहले नवीनतम ढांचे का उपयोग करने के लिए कोशिश कर रहा हूँ है) जो .NETCore 1.1.4 होगा लेकिन csproj में एकाधिक फ्रेमवर्क विशेषताओं को मुझे यह सुनिश्चित करने के लिए कि कौन सा टैग उपयोग करना है। मैं ऐसे संसाधनों को खोजने में असमर्थ था जो स्पष्ट रूप से दोनों के बीच मतभेदों को अलग करता है।

उत्तर

9

TargetFramework निर्भरता को हल करने और निर्धारित संपत्ति संकलन और आवेदन के निर्माण के लिए प्रयोग की जाने वाली करने के लिए NuGet द्वारा प्रयोग किया जाता है। (दृश्यों के पीछे, TargetFrameworkMoniker और TargetFrameworkVersion जैसे कुछ और गुण प्ले में आते हैं लेकिन एसडीके इसे फ्रेमवर्क के लिए सरल TargetFramework पर सारणीबद्ध करता है)।

RuntimeFrameworkVersion .NET कोर/netcoreapp के लिए विशिष्ट है। एसडीके Microsoft.NETCore.App पर RuntimeFrameworkVersion पर निर्भरता इंजेक्ट करेगा जो नवीनतम संस्करण को सेट या उपयोग करता है जो इसे .NET कोर < 2.0 के बारे में जानता है। संकल्पित संस्करण को लोड करने के लिए साझा ढांचे के संस्करण को हल करने के लिए .NET कोर होस्ट फ्रेमवर्क रिज़ॉल्वर के लिए runtimeconfig.json फ़ाइल पर लिखा गया है (=> उदाहरण के लिए .NET कोर 1.1.4 रनटाइम)।

netcoreapp1.0 के लिए उपयोग करने में सक्षम कारण है क्योंकि NuGet पैकेज में वास्तव में .NET कोर 1.0 बनाने के लिए आवश्यक संपत्तियां होती हैं। * अनुप्रयोग। हालांकि टूलिंग को यह नहीं पता है, इसलिए आपको एक .NET कोर 1.0 ऐप मिलेगा, लेकिन इसे 1.1 फ्रेमवर्क द्वारा लोड किया जाएगा क्योंकि यह runtimeconfig.json फ़ाइल में समाप्त होता है।

महत्वपूर्ण अंतर है:

  • यह केवल आत्म निहित निष्पादनयोग्य जो Microsoft.NETCore.App के संस्करण के लिए प्रयोग किया जाता है मायने रखती है।
    • यह पैकेज स्वयं निहित प्रकाशित करने के दौरान वांछित संस्करण के साथ पूर्ण रूपरेखा में खींच जाएगा (उदा।dotnet publish -r win7-x64)
    • जब आप 1.0.3 के लिए बनाया गया कोई एप्लिकेशन चलाते हैं लेकिन आपके पास 1.0.5 रनटाइम स्थापित है, तो 1.0.5 रनटाइम स्वचालित रूप से उपयोग किया जाएगा।
    • यदि आप RuntimeFrameworkVersion सेट नहीं करते हैं और एसडीके का एक नया संस्करण जारी किया जाता है जो .NET कोर के नए पैच संस्करणों के बारे में जानता है, तो यह स्वचालित रूप से नवीनतम संस्करण का उपयोग करेगा। यदि आप संस्करण को स्पष्ट रूप से सेट करते हैं, तो आप प्रोजेक्ट फ़ाइल को संपादित किए बिना अद्यतित नहीं हो सकते हैं।
  • RuntimeFrameworkVersion भी न्यूनतम क्रम कि आवेदन लोड होगा है - आप 1.0.4 के लिए सेट करता है, तो और एक मशीन केवल 1.0.3 स्थापित है पर चलाने के लिए प्रयास करते हैं, आवेदन शुरू नहीं होगी जब तक कि आप runtimeconfig.json फ़ाइल को संपादित।
  • RuntimeFrameworkVersion एक फ़्लोटिंग संस्करण पर सेट किया जा सकता है, जो पूर्वावलोकन संस्करणों या दैनिक निर्माण को लक्षित करते समय उपयोगी होता है, उदा। 2.1.0-preview1-* कॉन्फ़िगर किए गए NuGet फ़ीड्स पर उपलब्ध नवीनतम preview1 संस्करण को हल करेगा। इन से

अलावा, वहाँ केवल कुछ कारणों से, Microsoft.NETCore.App के एक उच्च संस्करण का उपयोग कर निर्माण करने के लिए DiaSymReader घटक के लिए एक निर्माण बग सुधार की तरह हैं।

नेट कोर 2.0 में, RuntimeFrameworkVersion के संस्करण हमेशा "पोर्टेबल अनुप्रयोगों" (गैर आत्म निहित) क्योंकि ढांचे के कार्यान्वयन नहीं रह गया है Microsoft.NETCore.App की निर्भरता और इस NuGet पैकेज द्वारा प्रदान की जाती है के लिए 2.0.0 हो जाएगा केवल है संकलन के लिए संदर्भ असेंबली प्रदान करने के लिए प्रयोग किया जाता है।

+2

यह एक शानदार जवाब है! ठीक है श्रीमान –

+0

तो मेरे कोड नमूने के रूप में दोनों गुणों के वास्तविक परिणाम क्या हैं? 'रनटाइमफ्रेमवर्क वर्जन' टैग स्पष्ट रूप से 'लक्ष्यफ्रेमवर्क' टैग पर प्राथमिकता लेते हुए, NuGet देखता है। फिर भी अगर मैं 'लक्ष्यफ्रेमवर्क' टैग को छोड़ देता हूं, तो परियोजना * लक्ष्यफ्रेमवर्क मूल्य "के साथ निर्माण करने में विफल रहता है। यह गलत वर्तनी हो सकती है। यदि नहीं, तो TargetFrameworkIdentifier और/या TargetFrameworkVersion गुणों को स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए। * – 8protons

+2

लक्ष्य ढांचा संकलन के लिए उपयोग किए जाने वाले पैकेज के टुकड़े को निर्दिष्ट करता है। तो यदि आप 'foobar1.0' लिखते हैं, तो यह काम नहीं करेगा। साथ ही, 'रनटाइमफ्रेमवर्क वर्जन' 'नेटकोरैप 'लक्ष्य ढांचे के लिए विशिष्ट है –

2

डॉक्स से, आप runtimeframeworkversion का उपयोग करना चाहिए केवल

आप जब नेट कोर को लक्षित क्रम की एक विशेष संस्करण की आवश्यकता है, तो आप संपत्ति अपनी परियोजना में (उदाहरण के लिए, 1.0.4) का उपयोग करने के बजाय चाहिए मेटापेकेज का संदर्भ देना।

https://docs.microsoft.com/en-us/dotnet/core/tools/csproj

+3

'RuntimeFrameworkVersion' का उपयोग तब किया जाना चाहिए जब' Microsoft.NETCore.App' पैकेज का एक विशिष्ट संस्करण आवश्यक हो। केवल सीमित संख्या में उपयोग के मामले हैं जहां आप वास्तव में ऐसा करना चाहते हैं। –

+2

यदि मैं अपने लक्ष्यफ्रेमवर्क टैग पर टिप्पणी करता हूं, तो मुझे अपनी 'माइक्रोसॉफ्ट.NET.TargetFrameworkInference.targets' फ़ाइल में निम्न त्रुटि मिलती है: "लक्ष्यफ्रेमवर्क मान' को पहचाना नहीं गया था। यह गलत वर्तनी हो सकती है। यदि नहीं, तो TargetFrameworkIdentifier और/या TargetFrameworkVersion गुणों को स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए " – 8protons

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