आप csproj के साथ .NET कोर क्लास लाइब्रेरी को बहु-लक्ष्य कैसे बनाते हैं?


94

जब .NET कोर अभी भी project.jsonप्रारूप का उपयोग करता है, तो आप कई फ्रेमवर्क (जैसे net451, netcoreapp1.0) को लक्षित करते हुए एक लाइब्रेरी का निर्माण कर सकते हैं ।

अब जब आधिकारिक प्रोजेक्ट प्रारूप csprojMSBuild का उपयोग कर रहा है, तो आप लक्ष्य के लिए कई रूपरेखाएँ कैसे निर्दिष्ट करते हैं? मैं VS2017 में परियोजना सेटिंग से ऐसा देखने के लिए कोशिश कर रहा हूँ, लेकिन मैं (यह और भी अन्य पूर्ण .नेट फ्रेमवर्क संस्करणों जो मैं सूची नहीं है केवल .NET कोर चौखटे से एक भी ढांचे को लक्षित करने में सक्षम हूँ है स्थापित किया है) :

यहां छवि विवरण दर्ज करें


यह वैसा नहीं है जैसा कि देखने में लगता है, आपको ड्रॉपडाउन में सूचीबद्ध .NETStandard 1.x विकल्प प्राप्त करना चाहिए। यह बहुत स्पष्ट नहीं है कि यह कैसे हुआ, आरंभ करने के लिए सही प्रोजेक्ट टेम्पलेट चुनना सुनिश्चित करें। "क्लास लाइब्रेरी (.NET मानक)" होना चाहिए। ऐसा लगता है कि आपने कंसोल ऐप टेम्प्लेट को चुना और फिर सही तरीके से नहीं, बल्कि गुणों को बदलना शुरू कर दिया। यदि आपने वास्तव में क्लास लाइब्रेरी टेम्पलेट का उपयोग किया है तो इंस्टॉल ठीक से नहीं हुआ है।
हंस पैसेंट

मैंने वास्तव में क्लास लाइब्रेरी (.NET कोर) का चयन किया है।
गिगी

2
सही है, इसलिए यदि आप बहु-लक्ष्य बनाना चाहते हैं तो यह गलत है। लाइब्रेरी को एक से अधिक प्लेटफॉर्म पर उपयोग करने योग्य बनाने के लिए आपको .NETStandard चुनना होगा।
हंस पैसेंट

इससे वह साफ हो जाता है। आप चाहें तो अपनी टिप्पणियों में से एक उत्तर लिख सकते हैं।
गिगी

जवाबों:


119

आप मैन्युअल रूप से संपादित करने के लिए प्रोजेक्ट फ़ाइल और ऐड की जरूरत रों डिफ़ॉल्ट TargetFramework और मूल रूप से करने के लिए बदल TargetFrameworks । तब आप एक के साथ मॉनीकर का उल्लेख करते हैं ; विभाजक।

इसके अलावा आप मैन्युअल रूप से एक सशर्त ItemGroup में या VS Nuget पैकेज प्रबंधक का उपयोग करके Nuget पैकेज संदर्भ रख सकते हैं।

यहाँ आपका .csproj कैसा दिखना चाहिए:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard1.6;net452</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net452'">
    <PackageReference Include="Microsoft.Azure.DocumentDB">
      <Version>1.12.0</Version>
    </PackageReference>
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.6'">
    <PackageReference Include="Microsoft.Azure.DocumentDB.Core">
    <Version>1.1.0</Version>
    </PackageReference>
  </ItemGroup>
</Project>

एक अन्य समस्या यह है कि मैं इन दिनों लापता प्रलेखन के कारण ऐसा कर रहा हूं कि मैं VS2015 में एक प्रोजेक्ट बनाता हूं और प्रोजेक्ट का निर्माण करता हूं। उपलब्ध दस्तावेज और इंटेलीजेंस का उपयोग करके, फिर VS2017 में समाधान खोलें और अंतर्निहित अपग्रेड का उपयोग करें। फिर मैं csproj फाइल को देख कर पता लगाऊंगा कि विन्यास कैसे होता है।

एक मोनीकर के बिना बहु-लक्ष्यीकरण और अधिक गूढ़ लक्ष्य :

माइक्रोसॉफ्ट:

पीसीएल अनुशंसित नहीं हैं +

हालांकि PCL का समर्थन किया जाता है, पैकेज लेखकों को इसके बजाय netstandard का समर्थन करना चाहिए। .NET प्लेटफ़ॉर्म स्टैंडर्ड PCLs का एक विकास है और प्लेटफ़ॉर्म पर बाइनरी पोर्टेबिलिटी का प्रतिनिधित्व करता है जो एक एकल मॉनीकर का उपयोग करता है जो पोर्टेबल-ए + बी + सी मॉनीकर्स जैसे स्थिर से बंधा नहीं है।

यदि आप एक पोर्टेबल प्रोफ़ाइल को लक्षित करना चाहते हैं, तो इसमें एक पूर्वनिर्धारित moniker नहीं है TargetFrameworkIdentifier, इसलिए पोर्टेबल प्रोफ़ाइल भी अवरूद्ध नहीं कर सकते TargetFrameworkVersion, और TargetFrameworkProfile। इसके अलावा एक संकलक स्थिरांक स्वचालित रूप से परिभाषित नहीं होता है। अंत में आपको सभी असेंबली संदर्भों को जोड़ना होगा, कोई भी डिफ़ॉल्ट रूप से प्रदान नहीं किया जाता है।

यह उदाहरण नीचे एक परियोजना से लिया गया है जो dynamicकीवर्ड का उपयोग करता है इसलिए इसे Microsoft.CSharpअसेंबली की आवश्यकता है , इस प्रकार आप देख सकते हैं कि यह विभिन्न लक्ष्यों के लिए संदर्भ कैसे है।

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard1.5;net40;portable40-net45+sl5+win8+wp8</TargetFrameworks>
  </PropertyGroup>

  <PropertyGroup Condition="'$(TargetFramework)'=='portable40-net45+sl5+win8+wp8'">
    <TargetFrameworkIdentifier>.NETPortable</TargetFrameworkIdentifier>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <TargetFrameworkProfile>Profile158</TargetFrameworkProfile>
    <DefineConstants>$(DefineConstants);PORTABLE158</DefineConstants>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='netstandard1.5'">
    <PackageReference Include="Microsoft.CSharp" Version="4.3.0" />
    <PackageReference Include="System.ComponentModel" Version="4.3.0" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='net40'">
    <Reference Include="Microsoft.CSharp" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='portable40-net45+sl5+win8+wp8'">
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Windows" />
  </ItemGroup>
</Project>

1
क्या आपको इसे csproj को मैन्युअल रूप से संपादित करके करना होगा, या इसे VS के माध्यम से किया जा सकता है?
गिगी

1
@ गीगी मल्टी टारगेटिंग को मैनुअली करने की जरूरत है। Nuget पैकेज VS2017 या मैन्युअल रूप से किया जा सकता है।
अबू

2
मैं एक ही मुद्दा रहा था, और सब कुछ ठीक होने के बाद मैंने s को <targetFramework> में जोड़ा। वास्तव में इच्छा है कि इन चीजों को बेहतर ढंग से प्रलेखित किया गया था।
नेगोरथ

2
@AsadSaeeduddin संभावना है कि Resharper आपको स्क्विगल्स दिखा रहा है न कि विजुअल स्टूडियो। $ (TargetFramework) का उपयोग केवल एक विशेष फ्रेमवर्क / मोनिकर को एक आइटम समूह उपलब्ध कराने के लिए किया जाता है।
अबू

2
@ORMapper यदि NuGet पैकेज सही ढंग से बनाया गया है तो आयात करते समय यह स्वचालित रूप से होना चाहिए। मतलब अगर NuGetPackageA पहले से ही कई चौखटों का समर्थन करता है, तो आपको इसे एक वातानुकूलित आइटम समूह में रखने की आवश्यकता नहीं है। अब यदि आपको .net कोर के लिए। नेट फ्रेमवर्क और पैकेजबी के लिए पैकेजए का संदर्भ देने की जरूरत है तो उसे वातानुकूलित आइटम समूह में रखना होगा। इंटरफ़ेस में आज (अक्टूबर 2017) का कोई विकल्प नहीं है।
ऐबू

24

आप इसके .csprojलिए फ़ाइल मैन्युअल रूप से संपादित कर सकते हैं और संपत्ति सेट TargetFrameworks(नहीं TargetFramework) कर सकते हैं।

<TargetFrameworks>net451;netstandard1.4</TargetFrameworks>

उदाहरण के लिए देखें EFCore.csproj: https://github.com/aspnet/EntityFrameworkCore/blob/951e4826a38ad5499b9b3ec6645e47c825fa842a/src/Enore/EFCore.csproj


9
धन्यवाद! यह मुझे मारता है। चार दशक पहले लिखी गई ब्रायन केर्निगन की "द एलिमेंट्स ऑफ प्रोग्रामिंग स्टाइल" में, वे चर के उपयोग की गलतियों के बारे में बात करते हैं जो अंत में एक अक्षर से भिन्न होते हैं। यदि नाम "TargetFrameworkList" होता तो यह बहुत स्पष्ट होता।
हावर्डो

आपके द्वारा इंगित उदाहरण में <लक्ष्यफ़्रामवर्क> संपत्ति शामिल नहीं है।
रेनीपेट

@ रेनीपेट, धन्यवाद! प्रोजेक्ट फ़ाइल समय में बदल गई है। मैंने लिंक को एक ठोस प्रतिबद्धता में बदल दिया है, जहां <TargetFrameworks> है।
नाइट वॉकर

12

मैंने वास्तव में क्लास लाइब्रेरी (.NET कोर) का चयन किया है।

यदि आपकी लाइब्रेरी को कई प्लेटफ़ॉर्म लक्ष्य पर काम करने की ज़रूरत नहीं है, तो वह प्रोजेक्ट टेम्प्लेट नहीं है। इस प्रोजेक्ट टेम्प्लेट के साथ, आपकी लाइब्रेरी का उपयोग केवल .NETCore को लक्षित करने वाली परियोजना में ही किया जा सकता है। पीसीएल पुस्तकालय दृष्टिकोण सेवानिवृत्त हो गया था, अब आपको एक .NET मानक को चुनना होगा।

आप "क्लास लाइब्रेरी (.NET मानक)" प्रोजेक्ट टेम्पलेट के साथ प्रोजेक्ट शुरू करके ऐसा करते हैं। अब आपके पास .NETStandard संस्करण को चुनने का विकल्प है। वर्तमान संगतता ग्रिड यहाँ है

उम्मीद है कि वे उस लिंक किए गए लेख को अपडेट रखेंगे। यह फ्लक्स में है। .NETStandard 2.0 को नीचे छोड़ दिया गया था, लेकिन अभी तक जहाज नहीं आया है। 2017 के Q2 के लिए लक्षित, वसंत का अंत शायद, यह वर्तमान में 97% के रूप में दिखाता है। मैंने डिजाइनरों को यह कहते हुए सुना है कि 1.5 या 1.6 का उपयोग करने की सिफारिश नहीं की गई है, 2.0 के साथ पर्याप्त रूप से संगत नहीं है


यदि आप विभिन्न लक्ष्य रूपरेखाओं के लिए अलग-अलग निर्भरता रखते हैं तो यह कैसे काम करता है? मेरा मतलब है कि project.jsonआप एक लक्ष्य ढांचे के लिए विशिष्ट निर्भरता निर्दिष्ट कर सकते हैं।
गिगी

1
मुझे 90% यकीन है कि आपको यह भूलने की ज़रूरत है कि यह कभी अस्तित्व में था। यह एक भ्रामक गड़बड़ी थी जो केवल .NET ठहराव को बूट करने के लिए एक स्टॉप-गैप माप था। मेरे द्वारा जुड़े संगतता ग्रिड का उपयोग करें।
हंस पसंत

मुझे उतना ही शक था। स्पष्ट करने के लिए धन्यवाद।
गिगी

4
यदि आपके पास विरासत कोड है और उसी समय आपके ग्रीनफील्ड का विकास हाल के पूर्ण ढांचे के फ्लेवर या डॉटनेटकोर में से किसी एक में किया जा सकता है, तो @ हंसपैंट मल्टी-टारगेट अभी भी सबसे अच्छा विकल्प है।
स्टेफानो रिकियार्डी

1
ग्रीनफ़ील्ड भी आवश्यक नहीं है। .NET कोर अभी तक अनुकूल नहीं है। मैं एज़्योर फंक्शन ऐप्स का उपयोग कर रहा हूं, लेकिन उनका .NET कोर संस्करण केवल कुछ ट्रिगर्स का समर्थन करता है। (मुझे सर्विस बस ट्रिगर की आवश्यकता है, इसलिए मैं .NET फ्रेमवर्क के साथ फंस गया हूं, और एक बहुत बड़ी व्यावसायिक-कार्यक्षमता लाइब्रेरी बहु-लक्ष्य के रूप में हवा दे सकती है।) Microsoft का प्लेटफ़ॉर्म अभी एक पेचीदा गड़बड़ है। यह DLL नर्क का आधुनिक समकक्ष है।
McGuireV10

5

मैंने मल्टी-टारगेटिंग नेट फ्रेमवर्क और नेटकोर के लिए एक शुरुआती गाइड किया, जो सरल 1-लाइन फिक्स से शुरू होता है और फिर आपको प्रत्येक जटिलता के माध्यम से चलता है।

सबसे आसान तरीका यह है कि पहले काम करते हुए नेटकोर या नेटस्टैंडर्ड टारगेट प्राप्त किया जाए। फिर csproj फ़ाइल को संपादित करें और अन्य लक्ष्यों के लिए इन चरणों से गुजरें।

  1. अपनी csproj फ़ाइल में सशर्त वर्गों के बारे में जानें, ताकि आप प्रत्येक लक्ष्य के लिए अलग-अलग निर्भरता घोषित कर सकें। प्रत्येक लक्ष्य के लिए सशर्त अनुभाग बनाएं।
  2. <Reference />sसिस्टम के लिए जोड़ें । * किसी भी नेटफ्रेमवर्क के टारगेट के लिए dlls यह पढ़कर कि क्या बिल्ड एरर मैसेजेज गायब हैं।
  3. <PackageReference />sउन मामलों में NuGet निर्भरता से निपटें जहां वे प्रत्येक लक्ष्य के लिए समान नहीं हैं। सबसे आसान चाल अस्थायी रूप से एकल लक्ष्यीकरण पर वापस लौटना है ताकि GUI आपके लिए सही ढंग से Nuget संदर्भ को संभाल ले।
  4. कोड के साथ व्यवहार करें, जो सभी प्रकार की तकनीकों, वर्कअराउंड और टाइमवियर्स को सीखकर सभी लक्ष्यों को संकलित नहीं करता है।
  5. जानिए जब ज्यादा टारगेट जोड़ने की लागत बहुत ज्यादा हो जाए तो अपने नुकसान में कटौती करें।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.