আপনি কীভাবে সিএসপিজেজের সাথে একটি নেট ক্লাসের লাইব্রেরিটিকে মাল্টি-টার্গেট করবেন?


96

.NET কোর এখনও project.jsonফর্ম্যাটটি ব্যবহার করার সময় , আপনি একাধিক ফ্রেমওয়ার্ক (যেমন নেট 451, নেটকোর অ্যাপ 1.0) লক্ষ্য করে একটি শ্রেণিকালীন গ্রন্থাগার তৈরি করতে পারেন ।

এখন যে অফিশিয়াল প্রকল্প ফর্ম্যাটটি csprojএমএসবিল্ড ব্যবহার করছে আপনি কীভাবে লক্ষ্যবস্তুতে একাধিক ফ্রেমওয়ার্ক নির্দিষ্ট করবেন? আমি VS2017 প্রকল্প সেটিংস থেকে এই জন্য চেহারা চেষ্টা করছি, কিন্তু আমি (এটা এমনকি অন্যান্য পূর্ণ .NET ফ্রেমওয়ার্ক সংস্করণ যা আমি তালিকায় নেই শুধুমাত্র .NET কোর অবকাঠামো থেকে একটি একক কাঠামোর লক্ষ্য সক্ষম না ইনস্টল করা আছে) :

এখানে চিত্র বর্ণনা লিখুন


এটি দেখতে দেখতে এমনটি মনে হয় না, আপনার ড্রপডাউন তালিকাভুক্ত .NETS স্ট্যান্ডার্ড 1.x পছন্দগুলি পাওয়া উচিত। এটি কীভাবে ঘটেছিল তা খুব স্পষ্ট নয়, শুরু করার জন্য সঠিক প্রকল্পের টেমপ্লেটটি বেছে নেওয়ার বিষয়ে নিশ্চিত হন। "ক্লাস লাইব্রেরি (। নেট স্ট্যান্ডার্ড)" হওয়া উচিত। দেখে মনে হচ্ছে আপনি কনসোল অ্যাপ্লিকেশন টেম্পলেটটি বেছে নিয়েছেন এবং তারপরে সঠিক উপায় নয়, বৈশিষ্ট্যগুলি পরিবর্তন করা শুরু করেছেন। আপনি যদি সত্যই ক্লাস লাইব্রেরি টেম্পলেট ব্যবহার করেন তবে ইনস্টলটি ভাল হয়নি।
হ্যানস প্যাস্যান্ট

আমি আসলে ক্লাস লাইব্রেরি (। নেট কোর) নির্বাচন করেছি।
জিগি

4
ঠিক আছে, তাই যদি আপনি বহু-টার্গেট করতে চান তবে এটি ভুল। একাধিক প্ল্যাটফর্মে লাইব্রেরিকে ব্যবহারযোগ্য করে তোলার জন্য আপনাকে একটি .NETS স্ট্যান্ডার্ড বাছাই করতে হবে।
হ্যানস প্যাস্যান্ট

এটি এটি পরিষ্কার করে দেয়। আপনি চাইলে আপনার মন্তব্য থেকে একটি উত্তর লিখতে পারেন।
জিগি

উত্তর:


122

আপনাকে প্রজেক্ট ফাইলটি ম্যানুয়ালি সম্পাদনা করতে হবে এবং ডিফল্ট টার্গেটফ্রেমওয়ার্কটিতে এস যুক্ত করতে হবে এবং মূলত এটিকে টার্গেটফ্রেমওয়ার্কে পরিবর্তন করতে হবে । তারপরে আপনি মনিকারকে একটি দিয়ে উল্লেখ করেছেন ;বিভাজক।

এছাড়াও আপনি শর্তসাপেক্ষ আইটেমগ্রুপে ম্যানুয়ালি বা ভিএস নুগেট প্যাকেজ ম্যানেজার ব্যবহার করে নুগেট প্যাকেজ রেফারেন্স রাখতে পারেন।

আপনার .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>

নিখোঁজ ডকুমেন্টেশনগুলির কারণে আমি আজকাল অন্য কাজটি করি যা হ'ল আমি ভিএস ২০১৫ এ একটি প্রকল্প তৈরি করেছি এবং উপলভ্য নথিপত্র এবং ইন্টেলিজেন্স ব্যবহার করে প্রজেক্ট.জসন তৈরি করি, তারপরে ভিএস2017 এ সমাধানটি খুলি এবং বিল্ট-ইন আপগ্রেড ব্যবহার করি। তারপরে কীভাবে কনফিগারেশনটি ঘটতে হয় তা নির্ধারণের জন্য আমি সিএসপ্রোজ ফাইলটি দেখব।

কোনও মনিকার ছাড়াই আরও বহু গুরূত্বপূর্ণ লক্ষ্যগুলি :

মাইক্রোসফ্ট:

পিসিএল সুপারিশ করা হয় না

পিসিএল সমর্থিত হলেও প্যাকেজ লেখকদের পরিবর্তে নেটস্ট্যান্ডার্ডকে সমর্থন করা উচিত। .NET প্ল্যাটফর্ম স্ট্যান্ডার্ড হ'ল পিসিএলগুলির একটি বিবর্তন এবং প্ল্যাটফর্মের জুড়ে বাইনারি বহনযোগ্যতার প্রতিনিধিত্ব করে যা কোনও একক মনিকার ব্যবহার করে যা পোর্টেবল-এ + বি + সি মনিকারের মতো স্ট্যাটিকের সাথে আবদ্ধ নয়।

আপনি যদি একটি পোর্টেবল প্রোফাইল লক্ষ্য করতে চান যদি একটি পূর্বনির্ধারিত নেই অবজ্ঞাসূচক তাই পোর্টেবল প্রোফাইল এটিও করতে পারেন না আভাসিত করা 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>

4
ম্যানুয়ালি সিএসপিজেজ সম্পাদনা করে আপনার কি এটি করতে হবে, বা এটি ভিএসের মাধ্যমে করা যেতে পারে?
গিগি

4
@ জিগি মাল্টি টার্গেটিং ম্যানুয়ালি করা দরকার। নিউট প্যাকেজগুলি ভিএস2017 এর মাধ্যমে বা ম্যানুয়ালি করা যেতে পারে।
আবু

4
আমার একই সমস্যা ছিল এবং আমি <টি টার্গেটফ্রেমওয়ার্ক> এ এস যুক্ত করার পরে সবকিছু ঠিকঠাক কাজ করেছে। সত্যিই এই জিনিসগুলি আরও ভাল নথিভুক্ত করা চাই।
নেগ্রোরথ

4
@ আসাদ সাaদুদ্দিনের সম্ভাবনা হ'ল রিশার্পার আপনাকে ভিজুয়াল স্টুডিও নয়, স্কুইগলস দেখাচ্ছে। Framework (টার্গেটফ্রেমওয়ার্ক) সবেমাত্র একটি নির্দিষ্ট ফ্রেমওয়ার্ক / মনিকারের আইটেমগ্রুপ উপলব্ধ করার জন্য ব্যবহৃত হয়।
আবু

4
@ অর্ম্প্পার যদি নুগেট প্যাকেজটি সঠিকভাবে নির্মিত হয় তবে আপনার আমদানি করার সময় এটি স্বয়ংক্রিয়ভাবে হওয়া উচিত। অর্থ যদি নুগেটপ্যাকেজএ ইতিমধ্যে একাধিক ফ্রেমওয়ার্ক সমর্থন করে, আপনার এটি কন্ডিশনার আইটেম গ্রুপে রাখার দরকার নেই। এখন আপনার .net ফ্রেমের জন্য .NET কাঠামোর জন্য প্যাকেজএ এবং প্যাকেজবি রেফারেন্স করতে হবে তবে তা কন্ডিশনড আইটেম গ্রুপে রাখা দরকার। আজ (অক্টোবর 2017) হিসাবে ইন্টারফেসে কোনও বিকল্প নেই।
আবু

24

আপনি নিজেই এর .csprojজন্য ফাইল সম্পাদনা করতে পারেন এবং সম্পত্তি TargetFrameworks( সেট না TargetFramework) সেট করতে পারেন ।

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

উদাহরণস্বরূপ দেখুন EFCore.csproj: https://github.com/aspnet/EntityFrameworkCore/blob/951e4826a38ad5499b9b3ec6645e47c825fa842a/src/EFCore/EFCore.csproj


9
ধন্যবাদ! এটি আমাকে মেরে ফেলে. চার দশক আগে রচিত ব্রায়ান কর্নিগানের "দ্য এলিমেন্টস অফ প্রোগ্রামিং স্টাইল" -তে তিনি ভেরিয়েবলগুলি ব্যবহার করার ভুল সম্পর্কে কথা বলেছেন যা শেষে একটি অক্ষর দ্বারা পৃথক হয়। নামটি যদি "টার্গেটফ্রেমওয়ার্কলিস্ট" হয় তবে এটি অনেক পরিষ্কার হত।
হাওয়ার্ড্লো

আপনি যে উদাহরণটিতে নির্দেশ করেছেন তাতে কোনও <টার্গেটফ্রেমওয়ার্কস> সম্পত্তি অন্তর্ভুক্ত নয়।
রেনিপেট

@ রেনিপিট, আপনাকে ধন্যবাদ! সময়ের সাথে সাথে প্রকল্পের ফাইলটি পরিবর্তিত হয়েছে। আমি লিঙ্কটি একটি কংক্রিট প্রতিশ্রুতিতে পরিবর্তন করেছি, যেখানে <টার্গেট ফ্রেমওয়ার্কস রয়েছে।
নাইট ওয়াকার

12

আমি আসলে ক্লাস লাইব্রেরি (। নেট কোর) নির্বাচন করেছি।

আপনার লাইব্রেরির একাধিক প্ল্যাটফর্ম লক্ষ্যগুলিতে কাজ করার প্রয়োজন হলে এটি আপনি চান এমন প্রকল্পের টেম্পলেট নয়। এই প্রকল্পের টেমপ্লেটের সাহায্যে আপনার গ্রন্থাগারটি কেবলমাত্র এমন প্রকল্পে ব্যবহার করা যেতে পারে যা .NETCore লক্ষ্য করে। পিসিএল লাইব্রেরি পদ্ধতির অবসর নেওয়া হয়েছিল, আপনাকে এখন একটি .NES স্ট্যান্ডার্ড বেছে নিতে হবে।

আপনি "ক্লাস লাইব্রেরি (। নেট স্ট্যান্ডার্ড)" প্রকল্পের টেম্পলেট দিয়ে প্রকল্পটি শুরু করে এটি করেন। আপনার কাছে এখন .NETS স্ট্যান্ডার্ড সংস্করণটি বাছাই করার বিকল্প রয়েছে। বর্তমানের সামঞ্জস্যতা গ্রিড এখানে

আশা করি তারা লিঙ্কিত নিবন্ধটি আপডেট রাখবেন। এটি প্রবাহিত, .NETS স্ট্যান্ডার্ড ২.০ এ পেরেক দেওয়া হয়েছিল তবে শিপ করা হয়নি। 2017 এর Q2 এর জন্য লক্ষ্যযুক্ত, সম্ভবত বসন্তের শেষে, এটি বর্তমানে 97% হিসাবে সম্পন্ন দেখায়। আমি ডিজাইনারদের শুনেছি যে 1.5 বা 1.6 ব্যবহারের প্রস্তাব দেওয়া হয় না, 2.0 এর সাথে যথেষ্ট উপযুক্ত নয়


আপনার যদি বিভিন্ন টার্গেট ফ্রেমওয়ার্কের জন্য আলাদা নির্ভরতা থাকে তবে এটি কীভাবে কাজ করবে? আমি বলতে চাইছি project.jsonআপনি কোনও লক্ষ্য কাঠামোর জন্য নির্দিষ্ট নির্ভরতা নির্দিষ্ট করতে পারেন।
জিগি

4
আমি 90% নিশ্চিত যে আপনার এটি ভুলে যাওয়ার দরকার যে এটি কখনও ছিল। এটি একটি বিভ্রান্তিকর জগাখিচুড়ি ছিল যা বুটস্ট্র্যাপ করার জন্য কেবল একটি স্টপ-গ্যাপ মাপ ছিল .NETCore। আমি যুক্ত লিঙ্কযুক্ত সামঞ্জস্যতা গ্রিড ব্যবহার করুন।
হ্যানস প্যাস্যান্ট

আমি যতটা সন্দেহ করেছিলাম। পরিষ্কার করার জন্য অনেক ধন্যবাদ!
গিগি

4
যদি আপনার লিগ্যাসি কোড থাকে এবং একই সাথে আপনার গ্রিনফিল্ডের বিকাশ সাম্প্রতিক সম্পূর্ণ ফ্রেমওয়ার্কের স্বাদ বা ডটনেটকোরের মধ্যে করা যেতে পারে তবে @ হ্যানসপ্যাস্যান্ট মাল্টি-টার্গেট এখনও সেরা বিকল্প।
স্টেফানো রিকার্দি

4
এমনকি গ্রীনফিল্ডও অগত্যা নয় N নেট কোর বন্ধুত্বপূর্ণ। আমি অ্যাজুরে ফাংশন অ্যাপ্লিকেশন ব্যবহার করছি তবে তাদের। নেট কোর সংস্করণটি কেবল কয়েকজন ট্রিগারকে সমর্থন করে। (আমার কাছে সার্ভিস বাস ট্রিগারগুলি দরকার, তাই আমি। নেট ফ্রেমওয়ার্কের সাথে আটকে আছি এবং একটি খুব বড় ব্যবসায়িক কার্যকারিতা গ্রন্থাগারটি মাল্টি-টার্গেট হিসাবে সজ্জিত হতে পারে)) মাইক্রোসফ্টের প্ল্যাটফর্ম এখনই একটি জটলা জবাবদিহি। এটি ডিএলএল হেলকের আধুনিক সমতুল্য।
ম্যাকগুয়ারভি 10

5

আমি মাল্টি-টার্গেটিং নেট ফ্রেমওয়ার্ক এবং নেটকোয়ারের জন্য একটি প্রাথমিক নির্দেশিকা করেছি যা সহজ 1-লাইন ফিক্স দিয়ে শুরু হয় এবং তারপরে প্রতিটি জটিলতার মধ্য দিয়ে আপনাকে নিয়ে যায়।

সবচেয়ে সহজ পদ্ধিতি হ'ল প্রথমে কাজ করা নেটকোর বা নেটস্ট্যান্ডার্ড টার্গেট। তারপরে সিএসপোজ ফাইলটি সম্পাদনা করুন এবং অন্যান্য লক্ষ্যগুলির জন্য এই পদক্ষেপগুলি অতিক্রম করুন।

  1. আপনার সিএসপোজ ফাইলের শর্তসাপেক্ষ বিভাগগুলি সম্পর্কে জানুন, যাতে আপনি প্রতিটি টার্গেটের জন্য বিভিন্ন নির্ভরতা ঘোষণা করতে পারেন। প্রতিটি লক্ষ্য জন্য শর্তসাপেক্ষ বিভাগ তৈরি করুন।
  2. <Reference />sসিস্টেমের জন্য যুক্ত করুন any বিল্ড ত্রুটি বার্তাগুলি যা বলে না তা কেবল পড়ে কোনও নেটফ্রেমওয়ার্ক লক্ষ্যমাত্রার জন্য dlls d
  3. নিউগেট নির্ভরতার সাথে ডিল করুন <PackageReference />sপ্রতিটি টার্গেটের ক্ষেত্রে সেগুলি এক নয় এমন ক্ষেত্রে নিয়ে কাজ করুন। সবচেয়ে সহজ কৌশলটি হল অস্থায়ীভাবে একক লক্ষ্যবস্তুতে ফিরে আসা যাতে জিইউআই আপনার জন্য নুগেটের রেফারেন্সগুলি সঠিকভাবে পরিচালনা করতে পারে।
  4. এমন কোডের সাথে ডিল করুন যা সৃজনশীল বিভিন্ন কৌশল, ওয়ার্কআরাউন্ডস এবং টাইমসভারগুলি শিখিয়ে সমস্ত লক্ষ্যগুলিতে সংকলন করে না।
  5. যখন আরও লক্ষ্যবস্তু যুক্ত করার ব্যয় খুব বেশি হয় তখন কখন আপনার ক্ষয়টি কমাতে হয় তা জানুন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.