প্রকল্পের আউটপুট ডিরেক্টরিতে নুগেট প্যাকেজ থেকে নেটিভ ফাইল যুক্ত করুন


126

আমি নেট নেট অ্যাসেমব্লির জন্য নিউগেট প্যাকেজ তৈরি করার চেষ্টা করছি যা একটি নেটিভ উইন 32 ডিএল-তে পিনভোক করে। আমার প্রজেক্টের রেফারেন্সে যুক্ত অ্যাসেম্বলি এবং নেটিভ ডেল উভয়ই প্যাক করা দরকার (এই অংশে কোনও সমস্যা নেই) এবং নেটিভ ডিএল প্রকল্পের আউটপুট ডিরেক্টরি বা অন্য কোনও সম্পর্কিত ডিরেক্টরিতে অনুলিপি করা উচিত।

আমার প্রশ্নগুলি হ'ল:

  1. আমি কীভাবে ভিজ্যুয়াল স্টুডিওতে রেফারেন্স তালিকায় এটি যুক্ত করার চেষ্টা না করে দেশী dll প্যাক করব?
  2. নেটিভ ডিএল অনুলিপি করার জন্য আমাকে কি ইনস্টল.পিএস 1 লিখতে হবে? যদি তাই হয় তবে আমি কীভাবে এটি অনুলিপি করার জন্য প্যাকেজ সামগ্রীটি অ্যাক্সেস করতে পারি?

1
রানটাইম / আর্কিটেকচার নির্দিষ্ট গ্রন্থাগারগুলির জন্য সমর্থন রয়েছে তবে বৈশিষ্ট্যের ডকুমেন্টেশনের অভাব রয়েছে এবং এটি ইউডাব্লুপি নির্দিষ্ট বলে মনে হচ্ছে। ডকস.মাইক্রোসফট.এইন
ওয়াটার

উত্তর:


131

Copyপ্রয়োজনীয় লাইব্রেরিগুলি অনুলিপি করতে লক্ষ্যগুলি ফাইলে লক্ষ্য ব্যবহার করা সেই ফাইলগুলিকে অন্যান্য প্রকল্পে অনুলিপি করে না যা প্রকল্পটি উল্লেখ করে, ফলস্বরূপ এ DllNotFoundException। এটি একটি Noneএলিমেন্ট ব্যবহার করে অনেক সহজ টার্গেট ফাইল দিয়ে করা যেতে পারে , কারণ এমএসবাইল্ড সমস্ত Noneফাইলগুলিকে রেফারেন্সিং প্রকল্পগুলিতে অনুলিপি করবে ।

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <NativeLibs Include="$(MSBuildThisFileDirectory)**\*.dll" />
    <None Include="@(NativeLibs)">
      <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

buildপ্রয়োজনীয় নেটিভ লাইব্রেরি সহ নুগেট প্যাকেজের ডিরেক্টরিতে লক্ষ্যগুলি ফাইল যুক্ত করুন । লক্ষ্যগুলি ফাইল dllডিরেক্টরিতে সমস্ত শিশু ডিরেক্টরিতে সমস্ত ফাইল অন্তর্ভুক্ত করবে build। সুতরাং কোনও পরিচালিত সমাবেশ দ্বারা ব্যবহৃত নেটিভ লাইব্রেরির একটি x86এবং x64সংস্করণ যুক্ত Any CPUকরতে আপনি নিম্নলিখিতের মতো ডিরেক্টরি কাঠামো দিয়ে শেষ করবেন:

  • বিল্ড
    • এক্স 86
      • NativeLib.dll
      • NativeLibDependency.dll
    • x64
      • NativeLib.dll
      • NativeLibDependency.dll
    • MyNugetPackageID.targets
  • liberal এর সংক্ষিপ্ত রূপ
    • net40
      • ManagedAssembly.dll

একই x86এবং x64ডিরেক্টরিগুলি নির্মাণের পরে প্রকল্পের আউটপুট ডিরেক্টরিতে তৈরি করা হবে। আপনার যদি সাব-ডিরেক্টরীগুলির প্রয়োজন না হয় তবে **ও এবং %(RecursiveDir)মুছে ফেলা যায় এবং পরিবর্তে buildসরাসরি ডিরেক্টরিগুলিতে প্রয়োজনীয় ফাইলগুলি অন্তর্ভুক্ত করতে পারেন । অন্যান্য প্রয়োজনীয় সামগ্রী ফাইলগুলিও একইভাবে যুক্ত করা যেতে পারে।

Noneটার্গেট ফাইল হিসাবে যুক্ত ফাইলগুলি ভিজুয়াল স্টুডিওতে খোলার পরে প্রকল্পে প্রদর্শিত হবে না। আপনি যদি ভাবছেন যে কেন আমি Contentনুপকিতে ফোল্ডারটি ব্যবহার করি না কারণ এটি পাওয়ারশেল স্ক্রিপ্ট ব্যবহার না করেCopyToOutputDirectory উপাদান সেট করার কোনও উপায় নেই (যা কেবল ভিজ্যুয়াল স্টুডিওর অভ্যন্তরে চালিত হবে, কমান্ড প্রম্পট থেকে নয়, বিল্ড সার্ভারগুলিতে বা ইন অন্যান্য আইডিই, এবং প্রকল্প.জসন / এক্সপ্রোজ ডিএনএক্স প্রকল্পগুলিতে সমর্থিত নয় ) এবং আমি প্রকল্পের মধ্যে ফাইলগুলির অতিরিক্ত অনুলিপি না রেখে ফাইলগুলিতে একটি ব্যবহার করতে পছন্দ করি ।Link

আপডেট: যদিও এটির Contentপরিবর্তে Noneএটির সাথেও কাজ করা উচিত যা দেখা যাচ্ছে যে মিসবিল্ডে একটি ত্রুটি রয়েছে তাই ফাইলগুলি এক ধাপের বেশি সরানো প্রকল্পগুলিকে রেফারেন্স করার জন্য অনুলিপি করা হবে না (যেমন প্রজ 1 -> প্রজ 2 -> প্রজ 3), প্রজ 3 ফাইলগুলি পাবে না প্রোজ 1 এর নুগেট প্যাকেজ থেকে তবে প্রোজ 2 হবে)।


4
স্যার, আপনি একজন প্রতিভা! একটি যাদুমন্ত্র মত কাজ করে. ধন্যবাদ।
মুনস্টম 19

ভাবছেন শর্ত কেন '$(MSBuildThisFileDirectory)' != '' And HasTrailingSlash('$(MSBuildThisFileDirectory)')প্রয়োজন? আমি ভেবেছিলাম যে MSBuildThisFileDirectoryসর্বদা সেট করা আছে। কখন যে হবে না?
kkm

@kkm সৎভাবে আমার দরকার নেই বলে মনে হয় না। আমি এটিকে মূলত কোথা থেকে পেয়েছি তা স্মরণ করতেও পারি না।
kjbartel

@kkm আমি প্রথমে System.Data.SQLite nuget প্যাকেজটি সংশোধন করেছি এবং মনে হয় আমি তাদের পিছনে থাকা সমস্ত ক্রেপ সরিয়ে দিলে আমি পিছনে ফেলেছি। আসল লক্ষ্যগুলি ফাইল
kjbartel

2
@ সুপারজেএমএন সেখানে ওয়াইল্ডকার্ড আছে। আপনি কি খেয়াল করেন নি **\*.dll? এটি .dllসমস্ত ডিরেক্টরিতে সমস্ত ফাইল অনুলিপি করা হয়। আপনি **\*.*পুরো ডিরেক্টরি ট্রি অনুলিপি করতে সহজেই করতে পারেন ।
kjbartel

30

আমি সম্প্রতি একই সমস্যা পেয়েছি যখন আমি উভয় পরিচালিত অ্যাসেম্বলি এবং নন-ম্যানেজড শেয়ার্ড ল্যারিগুলি (যা একটি x86সাব-ডিরেক্টরীতেও স্থাপন করতে হয়েছিল ) সহ একটি এমগুভিভি নিউগেট প্যাকেজ তৈরি করার চেষ্টা করেছি যা প্রতিটি বিল্ডের পরে বিল্ড আউটপুট ডিরেক্টরিতে স্বয়ংক্রিয়ভাবে অনুলিপি করতে হয়েছিল ।

এখানে আমি একটি সমাধান নিয়ে এসেছি, যা কেবল নুগেট এবং এমএসবিল্ডের উপর নির্ভর করে:

  1. পরিচালিত সমাহারগুলি রাখুন /libমধ্যে প্যাকেজ (সুস্পষ্ট অংশ) এবং অ-পরিচালিত ভাগ লাইব্রেরি ও সম্পর্কিত ফাইল (যেমন .pdb প্যাকেজ) এর তালিকা /buildসাব (বর্ণনা অনুযায়ী NuGet ডক্স )।

  2. সমস্ত অ-পরিচালিত *.dllফাইলের শেষের নাম পরিবর্তন করে অন্যরকম কিছু করুন, উদাহরণস্বরূপ *.dl_নিউগেটকে কোনও ভুল জায়গায় স্থাপন করা হয়েছে বলে অভিযোগযুক্ত অ্যাসেমব্লিগুলি ( "সমস্যা: লিব ফোল্ডারের বাইরে অ্যাসেম্বলি" " ) থেকে বিলাপ করা থেকে বিরত রাখতে ।

  3. নিম্নলিখিত বিষয়বস্তুর মতো কিছু সহ সাবডাইরেক্টরিতে একটি কাস্টম <PackageName>.targetsফাইল যুক্ত করুন /build(একটি বর্ণনার জন্য নীচে দেখুন):

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <ItemGroup>
        <AvailableItemName Include="NativeBinary" />
      </ItemGroup>
      <ItemGroup>
        <NativeBinary Include="$(MSBuildThisFileDirectory)x86\*">
          <TargetPath>x86</TargetPath>
        </NativeBinary>
      </ItemGroup>
      <PropertyGroup>
        <PrepareForRunDependsOn>
          $(PrepareForRunDependsOn);
          CopyNativeBinaries
        </PrepareForRunDependsOn>
      </PropertyGroup>
      <Target Name="CopyNativeBinaries" DependsOnTargets="CopyFilesToOutputDirectory">
        <Copy SourceFiles="@(NativeBinary)"
              DestinationFiles="@(NativeBinary->'$(OutDir)\%(TargetPath)\%(Filename).dll')"
              Condition="'%(Extension)'=='.dl_'">
          <Output TaskParameter="DestinationFiles" ItemName="FileWrites" />
        </Copy>
        <Copy SourceFiles="@(NativeBinary)"
              DestinationFiles="@(NativeBinary->'$(OutDir)\%(TargetPath)\%(Filename).%(Extension)')"
              Condition="'%(Extension)'!='.dl_'">
          <Output TaskParameter="DestinationFiles" ItemName="FileWrites" />
        </Copy>
      </Target>
    </Project>
    

উপরের .targetsফাইলটি টার্গেট প্রজেক্ট ফাইলের নুগেট প্যাকেজ ইনস্টল করার সময় ইনজেকশন দেওয়া হবে এবং আউটপুট ডিরেক্টরিতে নেটিভ লাইব্রেরিগুলি অনুলিপি করার জন্য দায়ী is

  • <AvailableItemName Include="NativeBinary" /> প্রকল্পের জন্য একটি নতুন আইটেম "বিল্ড অ্যাকশন" যুক্ত করে (এটি ভিজ্যুয়াল স্টুডিওর অভ্যন্তরে "বিল্ড অ্যাকশন" ড্রপডাউনেও উপলব্ধ হয়ে যায়)।

  • <NativeBinary Include=".../build/x86বর্তমান প্রকল্পে স্থাপন করা নেটিভ লাইব্রেরিগুলি যুক্ত করে এবং তাদের কাস্টম টার্গেটে অ্যাক্সেসযোগ্য করে তোলে যা এই ফাইলগুলি আউটপুট ডিরেক্টরিতে অনুলিপি করে।

  • <TargetPath>x86</TargetPath>ফাইলগুলিতে কাস্টম মেটাডেটা যুক্ত করে এবং কাস্টম টার্গেটকে দেশী ফাইলগুলি x86প্রকৃত আউটপুট ডিরেক্টরিটির সাব-ডিরেক্টরিতে অনুলিপি করতে বলে ।

  • <PrepareForRunDependsOn ...ব্লক লক্ষ্যমাত্রা তালিকায় কাস্টম লক্ষ্য বিল্ড উপর নির্ভর করে, দেখতে যোগ Microsoft.Common.targets বিস্তারিত জানার জন্য ফাইল।

  • কাস্টম লক্ষ্য,, CopyNativeBinariesদুটি অনুলিপি কাজ রয়েছে। প্রথমটি কোনও *.dl_ফাইলের অনুলিপিটি মূলটিতে ফিরে যাওয়ার সময় আউটপুট ডিরেক্টরিতে অনুলিপি করার জন্য দায়ী *.dll। দ্বিতীয়টি কেবল একই জায়গায় বাকী (উদাহরণস্বরূপ যে কোনও *.pdbফাইল) অনুলিপি করে । এটি একটি একক অনুলিপি টাস্ক এবং একটি ইনস্টল.পিএস 1 স্ক্রিপ্ট দ্বারা প্রতিস্থাপিত হতে পারে যা প্যাকেজ ইনস্টলেশনের সময় সমস্ত *.dl_ফাইলের নতুন নামকরণ করতে *.dllহয়েছিল।

তবে, এই সমাধানটি এখনও অন্য প্রকল্পের আউটপুট ডিরেক্টরিতে নেটিভ বাইনারিগুলি অনুলিপি করবে না যা প্রাথমিকভাবে নুগেট প্যাকেজ অন্তর্ভুক্ত করে। আপনার এখনও আপনার "চূড়ান্ত" প্রকল্পে নিউগেট প্যাকেজটি উল্লেখ করতে হবে।


4
" তবে, এই সমাধানটি এখনও অন্য প্রকল্পের আউটপুট ডিরেক্টরিতে নেটিভ বাইনারিগুলি অনুলিপি করবে না যা প্রাথমিকভাবে নুগেট প্যাকেজটি অন্তর্ভুক্ত করে। আপনাকে এখনও আপনার" চূড়ান্ত "প্রকল্পে নুগেট প্যাকেজটি উল্লেখ করতে হবে" "এটি একটি আমার জন্য স্টপার দেখান এর অর্থ সাধারণত আপনি একাধিক প্রকল্পে (যেমন ইউনিট পরীক্ষা) নুগেট প্যাকেজ যুক্ত করতে হবে অন্যথায় আপনি ছোঁড়াবেন DllNotFoundException
kjbartel

2
কেবলমাত্র সতর্কতার কারণে ফাইলগুলির নামকরণের জন্য কিছুটা কঠোর।

আপনি <NoWarn>NU5100</NoWarn>আপনার প্রকল্পের ফাইলটিতে যুক্ত করে সতর্কতাটি সরাতে পারবেন
ফ্লোরিয়ান কোচ

28

নিম্নলিখিত বিকল্পগুলির সাথে প্রকল্পে নেটিভ ডিএলএল ইনজেক্ট.targets করতে ব্যবহার করে এমন একটি বিকল্প এখানে রয়েছে ।

  • Build action = None
  • Copy to Output Directory = Copy if newer

এই কৌশলটির মূল সুবিধা হ'ল দেশীয় ডিএলএল নির্ভরযোগ্য প্রকল্পগুলিরbin/ ফোল্ডারে ট্রান্সজিটিভলি অনুলিপি করা হয় ।

.nuspecফাইলের বিন্যাস দেখুন :

নুগেট প্যাকেজ এক্সপ্লোরারের স্ক্রিন ক্যাপচার

.targetsফাইলটি এখানে :

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <None Include="$(MSBuildThisFileDirectory)\..\MyNativeLib.dll">
            <Link>MyNativeLib.dll</Link>
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
    </ItemGroup>
</Project>

এটি MyNativeLib.dllমূল প্রকল্পের অংশ হিসাবে এটি সন্নিবেশ করায় (তবে কৌতূহলীভাবে ফাইলটি ভিজ্যুয়াল স্টুডিওতে দৃশ্যমান নয়)।

ফোল্ডারে <Link>গন্তব্য ফাইলের নাম সেট করে এমন উপাদানটি লক্ষ্য করুন bin/


আমার Azure পরিষেবার অংশ হিসাবে আমাকে অন্তর্ভুক্ত করা দরকার এমন কিছু .bat এবং .ps1 ফাইলগুলির সাথে একটি ট্রিট কাজ করে - ধন্যবাদ :)
ঝাফ - বেন ডুগইড

"(তবে কৌতূহলীভাবে ফাইলটি ভিজ্যুয়াল স্টুডিওতে দৃশ্যমান নয়)"। - প্রজেক্ট ফাইলগুলি ভিএস নিজেই এএফএইকে দ্বারা পার্স করা হয়, সুতরাং বাহ্যিক .target ফাইলগুলিতে যুক্ত আইটেমগুলি (বা লক্ষ্য নির্বাহের ক্ষেত্রে গতিশীলভাবে তৈরি হওয়া) প্রদর্শিত হয় না।
kkm

কিভাবে এই কোনো ভিন্ন অন্যান্য আগের উত্তর থেকে পরিবর্তন ছাড়া অন্য Contentকরা None?
kjbartel

3
বাহ আপনি দ্রুত যাইহোক, আপনি যদি এটি করতে পছন্দ করেন তবে আপনি কমপক্ষে জিজ্ঞাসা করতে পারেন 'এটি আমার উত্তর থেকে কীভাবে আলাদা'। সেই ইমোটি মূল প্রশ্নের সম্পাদনা করা, নিজের উত্তর দেওয়া এবং তারপরে অন্য লোকের মন্তব্যে আপনার উত্তর প্রচার করার চেয়ে সুন্দর be আমি এই নির্দিষ্ট উত্তরটি ব্যক্তিগতভাবে আপনার চেয়ে ভাল বলে মনে করি না - এটি সংক্ষিপ্ত, পয়েন্টে এবং পড়তে সহজ
মাকসিম সাতসিকাউ

3
পছন্দ করুন আমি এটিকে আরও পরিষ্কার করার জন্য প্রশ্নটি সম্পাদনা করেছি, তারপরে প্রশ্নের উত্তর দিয়েছি। এই উত্তরটি কয়েক সপ্তাহ পরে এসেছিল এবং কার্যকরভাবে একটি অনুলিপি ছিল। আমি যদি অভদ্রতা পেয়েছি তবে দুঃখিত।
কেজবার্তেল

19

অন্য কেউ যদি এই জুড়ে হোঁচট খায়।

.targetsফাইলের নাম হবে সমান NuGet প্যাকেজ আইডি

অন্য কিছু কাজ করবে না।

ক্রেডিটগুলিতে যান: https://sushihangover.github.io/nuget-and-msbuild-targets/

এটি এখানে উল্লিখিত হিসাবে আমার আরও পুঙ্খানুপুঙ্খভাবে পড়া উচিত ছিল। আমাকে যুগে যুগে নিয়ে গেছে ..

একটি কাস্টম যুক্ত করুন <PackageName>.targets


3
তুমি আমার পুরো দিন বাঁচাও!
zheng yu

1
আপনি অন্য এক কিছুর সাথে এক সপ্তাহ দীর্ঘ সমস্যা স্থির করেছেন। আপনাকে এবং সেই গিথুব পৃষ্ঠাকে ধন্যবাদ।
গ্লেন ওয়াটসন

13

কিছুটা দেরি হলেও এর জন্য আমি একটি নুগেট প্যাকেজ এক্সেসলিটি তৈরি করেছি।

আপনার নুগেট প্যাকেজে অতিরিক্ত বিশেষ ফোল্ডার রাখার ধারণা। আমি নিশ্চিত যে আপনি ইতিমধ্যে লিব এবং সামগ্রী জানেন। আমি যে নুগেট প্যাকেজ তৈরি করেছি তাতে আউটপুট নামের ফোল্ডারের সন্ধান হয় এবং সেখানে থাকা প্রতিটি প্রকল্পের আউটপুট ফোল্ডারে অনুলিপি করবে।

আপনাকে কেবলমাত্র যা করতে হবে তা হ'ল প্যাকেজটিতে একটি নিউজ নির্ভরতা যুক্ত করুন http://www.nuget.org/packages/Baseclass.Contrib.Nuget.Output/

আমি এ সম্পর্কে একটি ব্লগ পোস্ট লিখেছি: http://www.baseclass.ch/blog/Lists/Beitraege/Post.aspx?ID=6&mobile=0


সেটা খুবই ভালো! তবে এটি কেবল বর্তমান প্রকল্পে কাজ করে। যদি প্রকল্পটি একটি "ক্লাস লাইব্রেরি" হয় এবং আপনি উদাহরণস্বরূপ কোনও "ওয়েব অ্যাপ্লিকেশন" এর উপর নির্ভরতা যুক্ত করতে চান, ডিএলএলগুলি ওয়েব অ্যাপ্লিকেশনটিতে তৈরি করা হবে না! আমার "কুইক ফিক্স" হ'ল: আপনার লাইব্রেরির জন্য একটি নিউগেট তৈরি করুন, এবং ক্লাস লাইব্রেরিতে আবেদন করুন এবং নির্ভরতার জন্য আরেকটি নিউগেট তৈরি করুন (এই ক্ষেত্রে ডল) এবং ওয়েব অ্যাপ্লিকেশনটিতে প্রয়োগ করুন। এর জন্য কোন সেরা সমাধান?
ওয়াগনার লিওনার্দি

আপনি এই প্রকল্পটি কেবল নেট নেট 4.0.০ (উইন্ডোজ) এর জন্য তৈরি করেছেন বলে মনে হয়। আপনি কি বহনযোগ্য শ্রেণীর পাঠাগারগুলিকে সমর্থন করার জন্য এটি আপডেট করার পরিকল্পনা করছেন?
আনি

1

একটি খাঁটি সি # সমাধান রয়েছে যা আমি ব্যবহার করা সহজ বলে মনে করি এবং আমাকে নুগেট সীমাবদ্ধতা নিয়ে বিরক্ত করতে হবে না। এই পদক্ষেপগুলি অনুসরণ করুন:

আপনার প্রকল্পে নেটিভ লাইব্রেরি অন্তর্ভুক্ত করুন এবং এর বিল্ড অ্যাকশন সম্পত্তি সেট করুন Embedded Resource

ক্লাসে নিম্নলিখিত কোডটি আটকান যেখানে আপনি এই লাইব্রেরিকে পিনভোক করেন।

private static void UnpackNativeLibrary(string libraryName)
{
    var assembly = Assembly.GetExecutingAssembly();
    string resourceName = $"{assembly.GetName().Name}.{libraryName}.dll";

    using (var stream = assembly.GetManifestResourceStream(resourceName))
    using (var memoryStream = new MemoryStream(stream.CanSeek ? (int)stream.Length : 0))
    {
        stream.CopyTo(memoryStream);
        File.WriteAllBytes($"{libraryName}.dll", memoryStream.ToArray());
    }
}

এই পদ্ধতিটি নীচের মতো স্থিতিশীল নির্মাণকারী থেকে কল করুন UnpackNativeLibrary("win32");এবং এটি আপনার প্রয়োজন হওয়ার ঠিক আগে লাইব্রেরিকে ডিস্কে আনপ্যাক করবে। অবশ্যই, আপনার অবশ্যই নিশ্চিত হওয়া উচিত যে ডিস্কের সেই অংশে আপনার লেখার অনুমতি রয়েছে।


1

এটি একটি পুরানো প্রশ্ন, তবে আমার এখন একই সমস্যা রয়েছে এবং আমি এমন একটি টার্নআরন্ড পেয়েছি যা কিছুটা জটিল তবে খুব সহজ এবং কার্যকর: প্রতিটি কনফিগারেশনের জন্য একটি সাবটোল্ডার সহ নীগেট স্ট্যান্ডার্ড সামগ্রী ফোল্ডারে তৈরি করুন:

/Content
 /bin
   /Debug
      native libraries
   /Release
      native libraries

আপনি যখন নসপেক ফাইলটি প্যাক করেন, আপনি ডিবাগ এবং রিলিজ ফোল্ডারে প্রতিটি নেটিভ লাইব্রেরির জন্য নিম্নলিখিত বার্তাটি পাবেন:

ইস্যু: লিব ফোল্ডারের বাইরে সমাবেশ। বিবরণ: সমাবেশ 'কন্টেন্ট \ বিন \ ডিবাগ \ ??????? dll' 'lib' ফোল্ডারের মধ্যে নেই এবং সুতরাং প্যাকেজটি কোনও প্রকল্পে ইনস্টল হওয়ার পরে এটি রেফারেন্স হিসাবে যুক্ত হবে না। সমাধান: যদি এটি উল্লেখ করা হয় তবে এটিকে 'lib' ফোল্ডারে সরান into

আমাদের এ জাতীয় "সমাধান" দরকার নেই কারণ এটি কেবল আমাদের লক্ষ্য: দেশীয় গ্রন্থাগারগুলিকে নেট অ্যাসেমব্লিসি রেফারেন্স হিসাবে যুক্ত করা হয় না।

সুবিধাগুলি হ'ল:

  1. অদ্ভুত প্রভাবগুলির সাথে কোন জটিল স্ক্রিপ্টগুলির সহজ সমাধান যা প্যাকেজ আনইনস্টল এ পুনরায় সেট করা কঠিন।
  2. নিউগেট ইনস্টল ও আনইনস্টল করার সময় নেটিভ লাইব্রেরিগুলিকে অন্য কোনও সামগ্রী হিসাবে পরিচালনা করে।

অসুবিধাগুলি হ'ল:

  1. প্রতিটি কনফিগারেশনের জন্য আপনার একটি ফোল্ডার প্রয়োজন (তবে সাধারণত কেবল দুটি থাকে: ডিবাগ এবং রিলিজ এবং আপনার যদি অন্য কনটেন্ট থাকে যা প্রতিটি কনফিগারেশন ফোল্ডারে ইনস্টল করা আবশ্যক তবে এটি হয় উপায়)
  2. নেটিভ লাইব্রেরিগুলি অবশ্যই প্রতিটি কনফিগারেশন ফোল্ডারে নকল করতে হবে (তবে প্রতিটি কনফিগারেশনের জন্য যদি আপনার নেটিভ লাইব্রেরির বিভিন্ন সংস্করণ থাকে তবে এটি হয় যাওয়ার উপায়)
  3. প্রতিটি ফোল্ডারে প্রতিটি নেটিভ ডিলের জন্য সতর্কতা (তবে আমি যেমন বলেছি যে, তারা সতর্কতাগুলি প্যাকেজ প্যাকেজটিতে প্যাকেজ প্রস্তুতকারীর কাছে জারি করা হয়, ভিএস ইনস্টল করার সময় প্যাকেজ ব্যবহারকারীকে নয়)

0

আমি আপনার সঠিক সমস্যাটি সমাধান করতে পারি না, তবে আমি আপনাকে একটি পরামর্শ দিতে পারি।

আপনার মূল প্রয়োজনীয়তাটি হ'ল: "এবং এটিতে রেফারেন্সটি স্বয়ংক্রিয়ভাবে নিবন্ধভুক্ত করা উচিত নয়" .....

সুতরাং আপনাকে "সমাধান আইটেমগুলির" সাথে পরিচিত হতে হবে

এখানে রেফারেন্স দেখুন:

নুগেট প্যাকেজে সমাধান-স্তরের আইটেম যুক্ত করা হচ্ছে

আপনার নেটিভ ডেলের অনুলিপিটি তার ঘরে আনার জন্য আপনাকে কিছু পাওয়ারসেল ভুডো লিখতে হবে (আবার, কারণ আপনি অটো-অ্যাড-রেফারেন্স ভুডো গুলি চালাতে চান না)

তৃতীয় পক্ষের রেফারেন্স ফোল্ডারে ফাইলগুলি রাখার জন্য এখানে আমি লিখেছি একটি পিএস 1 ফাইল।

স্ক্র্যাচ থেকে শুরু না করে কীভাবে আপনার নেটিভ ডেলিকে কিছু "বাড়িতে" অনুলিপি করবেন তা আপনার পক্ষে যথেষ্ট আছে।

আবার এটি সরাসরি-হিট নয়, এটি কোনও কিছুর চেয়ে ভাল।

param($installPath, $toolsPath, $package, $project)
if ($project -eq $null) {
$project = Get-Project
}

Write-Host "Start Init.ps1" 

<#
The unique identifier for the package. This is the package name that is shown when packages are listed using the Package Manager Console. These are also used when installing a package using the Install-Package command within the Package Manager Console. Package IDs may not contain any spaces or characters that are invalid in an URL.
#>
$separator = " "
$packageNameNoVersion = $package -split $separator | select -First 1

Write-Host "installPath:" "${installPath}"
Write-Host "toolsPath:" "${toolsPath}"
Write-Host "package:" "${package}"
<# Write-Host "project:" "${project}" #>
Write-Host "packageNameNoVersion:" "${packageNameNoVersion}"
Write-Host " "

<# Recursively look for a .sln file starting with the installPath #>
$parentFolder = (get-item $installPath)
do {
        $parentFolderFullName = $parentFolder.FullName

        $latest = Get-ChildItem -Path $parentFolderFullName -File -Filter *.sln | Select-Object -First 1
        if ($latest -ne $null) {
            $latestName = $latest.name
            Write-Host "${latestName}"
        }

        if ($latest -eq $null) {
            $parentFolder = $parentFolder.parent    
        }
}
while ($parentFolder -ne $null -and $latest -eq $null)
<# End recursive search for .sln file #>


if ( $parentFolder -ne $null -and $latest -ne $null )
{
    <# Create a base directory to store Solution-Level items #>
    $thirdPartyReferencesDirectory = $parentFolder.FullName + "\ThirdPartyReferences"

    if ((Test-Path -path $thirdPartyReferencesDirectory))
    {
        Write-Host "--This path already exists: $thirdPartyReferencesDirectory-------------------"
    }
    else
    {
        Write-Host "--Creating: $thirdPartyReferencesDirectory-------------------"
        New-Item -ItemType directory -Path $thirdPartyReferencesDirectory
    }

    <# Create a sub directory for only this package.  This allows a clean remove and recopy. #>
    $thirdPartyReferencesPackageDirectory = $thirdPartyReferencesDirectory + "\${packageNameNoVersion}"

    if ((Test-Path -path $thirdPartyReferencesPackageDirectory))
    {
        Write-Host "--Removing: $thirdPartyReferencesPackageDirectory-------------------"
        Remove-Item $thirdPartyReferencesPackageDirectory -Force -Recurse
    }

    if ((Test-Path -path $thirdPartyReferencesPackageDirectory))
    {
    }
    else
    {
        Write-Host "--Creating: $thirdPartyReferencesPackageDirectory-------------------"
        New-Item -ItemType directory -Path $thirdPartyReferencesPackageDirectory
    }

    Write-Host "--Copying all files for package : $packageNameNoVersion-------------------"
    Copy-Item $installPath\*.* $thirdPartyReferencesPackageDirectory -recurse
}
else
{
        Write-Host "A current or parent folder with a .sln file could not be located."
}


Write-Host "End Init.ps1" 

-2

এটি কন্টেন্ট ফোল্ডার রাখুন

nuget pack [projfile].csprojআপনি যদি বিষয়বস্তু হিসাবে ফাইলগুলি চিহ্নিত করেন তবে আদেশটি স্বয়ংক্রিয়ভাবে এটি আপনার জন্য করবে do

তারপরে আইটেমগ্রুপ এবং নেটিভলিব এবং কোনও কিছুই উপাদান যুক্ত না করে এখানে প্রকল্প ফাইলটি সম্পাদনা করুন

<ItemGroup>
    <NativeLibs Include="$(MSBuildThisFileDirectory)**\*.dll" />
    <None Include="@(NativeLibs)">
      <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
</ItemGroup>

আমার জন্য কাজ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.