"রেফারেন্সড অ্যাসেম্বলিটির শক্ত নাম নেই" কীভাবে ঠিক করবেন?


241

আমি আমার ভিজ্যুয়াল স্টুডিও 2005 প্রকল্পে (যা দৃ strongly়ভাবে নামকরণ করা হয়েছে) একটি দুর্বল নামযুক্ত সমাবেশ যুক্ত করেছি । আমি এখন ত্রুটি পাচ্ছি:

"রেফারেন্সড অ্যাসেমব্লিয়া 'xxxxxxxx' এর শক্ত নাম নেই"

আমার কি এই তৃতীয় পক্ষের সমাবেশে স্বাক্ষর করতে হবে?



1
এটি মূর্খ টিপের মতো শোনাতে পারে তবে আপনি যদি দেখতে পান যে আপনার কাজটি যাই হোক না কেন আপনার সমাবেশ সই হচ্ছে না, আপনার বিল্ড সেটিংস পরীক্ষা করে দেখুন; মনে রাখবেন যে আপনি পুনর্নির্মাণ / পরিষ্কার করার সময় ভিএস অন্যান্য আর্কিটেকচার (যেকোন সিপিইউ, এক্স 64, ইত্যাদি) সাফ করে না, যাতে আপনি অন্য কোনও স্থাপত্যের থেকে পুরানো dll দিকে তাকিয়ে থাকতে পারেন।
জুন

উত্তর:


213

এই ত্রুটি এড়াতে আপনি এটি করতে পারেন:

  • অ্যাসেম্বলিটি গতিশীলভাবে লোড করুন বা
  • তৃতীয় পক্ষের সমাবেশে স্বাক্ষর করুন।

আপনি তৃতীয় পক্ষের সমাহারগুলি সাইন ইন নির্দেশাবলী পাবেন কোনো সাইন পরিষদের সাইন ইন (বিলম্ব সাইন ইন না করেই): .NET-Fu

তৃতীয় পক্ষের সমাবেশগুলিতে স্বাক্ষর করা হচ্ছে

একটি থার্পি-পার্টিতে স্বাক্ষর করার মূল নীতিটি হল

  1. ildasm.exeঅন্তর্বর্তী ভাষা (আইএল) ব্যবহার করে সমাবেশকে ডিসসেম্বেস করুন :

    ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll 
  2. সমাবেশটি পুনর্নির্মাণ এবং স্বাক্ষর করুন:

    ilasm /dll /key=myKey.snk thirdPartyLib.il

অতিরিক্ত রেফারেন্স ঠিক করা

উপরের পদক্ষেপগুলি ঠিক ততক্ষণ কার্যকর হয় যদি না আপনার তৃতীয় পক্ষের সমাবেশ ( এডল ) অন্য লাইব্রেরি ( B.dll ) উল্লেখ করে যা স্বাক্ষর করতে হবে। আপনি অবতরণ করতে পুনর্নির্মাণের এবং উভয় সাইন A.dll এবং B.dll উপরে কমান্ড ব্যবহার করে, কিন্তু রানটাইম এ লোড B.dll কারণ ব্যর্থ হবে A.dll মূলত একটি রেফারেন্স সঙ্গে নির্মিত হয়েছিল স্বাক্ষরবিহীন সংস্করণ B.dll

এই সমস্যার সমাধানটি উপরের 1 ধাপে উত্পন্ন আইএল ফাইলটি প্যাচ করা। আপনার রেফারেন্সে B.dll এর সর্বজনীন কী টোকেন যুক্ত করতে হবে। আপনি কল করে এই টোকেন পাবেন

sn -Tp B.dll 

যা আপনাকে নিম্নলিখিত আউটপুট দেবে:

Microsoft (R) .NET Framework Strong Name Utility  Version 4.0.30319.33440
Copyright (c) Microsoft Corporation.  All rights reserved.

Public key (hash algorithm: sha1):
002400000480000094000000060200000024000052534131000400000100010093d86f6656eed3
b62780466e6ba30fd15d69a3918e4bbd75d3e9ca8baa5641955c86251ce1e5a83857c7f49288eb
4a0093b20aa9c7faae5184770108d9515905ddd82222514921fa81fff2ea565ae0e98cf66d3758
cb8b22c8efd729821518a76427b7ca1c979caa2d78404da3d44592badc194d05bfdd29b9b8120c
78effe92

Public key token is a8a7ed7203d87bc9

শেষ লাইনে সর্বজনীন কী টোকেন রয়েছে। তারপরে B.dll রেফারেন্সের জন্য আপনাকে A.dll এর আইএল অনুসন্ধান করতে হবে এবং নীচে টোকেন যুক্ত করতে হবে:

.assembly extern /*23000003*/ MyAssemblyName
{
  .publickeytoken = (A8 A7 ED 72 03 D8 7B C9 )                         
  .ver 10:0:0:0
}

2
এইভাবে অ্যাসেমব্লিকে বিকল্প হিসাবে সই করা হচ্ছে, আমি অ্যাসেম্বলিকে গতিশীলভাবে লোড করতে বা স্বাক্ষর করতে চাই না। আমি জানি যে শক্তিশালী নামকরণ গ্লোবাল অ্যাসেম্বলি ক্যাশে (জিএসি) এর সাথে সম্পর্কিত। তবুও, আমি আমার সমাবেশগুলি GAC এর অংশ করতে চাই না এবং সেগুলিও COM- দৃশ্যমান নয় are আমি মনে করি আংশিকভাবে এমন কিছু কিছু মনে আছে যা আমরা করতে পারি যা এটি সই না করে এই সমাবেশটি ব্যবহারের অনুমতি দেবে। এটি বিকল্প কোথাও কোথাও রয়েছে properties আমি কি সেই পথে যেতে চাইছি?
উইল মারকুইলার

27
আপনার সমাবেশটি স্বাক্ষর না থাকলে আপনি স্বাক্ষরবিহীন সমাবেশগুলিও ব্যবহার করতে পারেন।
ওজে।

2
.NET-fu এর লিঙ্কটি একটি দুর্দান্ত সংস্থান
থাইডুড

2
যদিও উপরের পদক্ষেপগুলি "বেশিরভাগ" পরিস্থিতিতে কাজ করবে, এটি অবিশ্বাস্যভাবে সময় সাপেক্ষ এবং ত্রুটির প্রবণ এবং অন্যান্য বিষয়গুলির মধ্যে বন্ধু সমাবেশে উল্লেখগুলি ব্যর্থ করে। : শুধু এটা সব স্বয়ংক্রিয়ভাবে (লজ্জাহীন প্লাগ) করতে এই ইউটিলিটি ব্যবহার stackoverflow.com/a/19459609/564726
BrutalDev

1
@ রোল আমি প্রক্রিয়াটি এখানে বিস্তারিত বর্ণনা করেছি delabs.io/the-12th-labor-of-a-net-developer-part-4
থিউড

98

যে প্রকল্প ফাইলটি ব্যবহার করছে তার প্রজেক্ট ফাইলটি প্রসারিত করুন যার "শক্ত নাম কী নেই" এবং .snkফাইলটি (.StrongNameKey) সন্ধান করুন।

উইন্ডোজ এক্সপ্লোরারে এই ফাইলটি ব্রাউজ করুন (কেবল যাতে আপনি জানেন যে এটি কোথায়)।

প্রজেক্টে ভিজ্যুয়াল স্টুডিওতে ফিরে আসুন যার "দৃ name় নাম কী নেই", করুন

  • প্রকল্পের ফাইলটিতে রাইট ক্লিক করুন
  • বৈশিষ্ট্য নির্বাচন করুন
  • "সাইনিং ট্যাব" নির্বাচন করুন (বাম দিকে)
  • "সমাবেশে স্বাক্ষর করুন" চেক বাক্সটি ক্লিক করুন
  • তারপরে <Browse>আপনি যে .snkফাইলটি আগে খুঁজে পেয়েছেন সেটিতে

কৌতুক করা উচিত। এটি একই সমস্যার মধ্যে অন্য প্রকল্পের ভিতরে একটি ফর্ম ব্যবহার করে একটি প্রকল্পের জন্য আমার সমস্যার সমাধান করে।

আমি আসা করি এটা সাহায্য করবে.


আমি যদি আমার সমাবেশে স্বাক্ষর করতে না চাই তবে আমি এটি শুরু থেকেই সই করতাম না!
mohas

যদি আপনি .snk-file খুঁজে না পান: প্রকল্পের বৈশিষ্ট্যগুলি ("শক্ত নাম" ত্রুটির সাথে প্রকল্পটি ব্যবহার করে প্রকল্পের) খুলুন, ট্যাব সাইন ইন করুন। সেখানে আপনি প্রকল্পটি সাইন করতে ব্যবহৃত ফাইলটি দেখতে পাবেন (.snk এক্সটেনশান সহ সবসময় কোনও ফাইল নয়)। এই প্রকল্পটিকে অন্য প্রকল্পে অনুলিপি করুন।
কোডার 14

MrOli3000 হিসাবে উল্লেখ করা হয়েছে যে শক্তিশালী নাম কী ফাইলটি অনুপস্থিত রয়েছে এমন কোনও সমাধান থাকলে এটি কেবলমাত্র কাজ করে। যদি এমন একাধিক প্রকল্প রয়েছে যা স্বাক্ষরবিহীন প্রকল্পটির উল্লেখ করে, তবে কোনও দ্বন্দ্ব এড়ানোর জন্য আপনি একটি নতুন শক্তিশালী নাম কী ফাইল তৈরি করা ভাল। আমার ক্ষেত্রে, সমাধানটি তৈরি করেনি, এবং আমি সংশোধন করার চেষ্টা করে চেনাশোনাগুলিতে যাচ্ছি। VS2017 হিসাবে, ফর্ম্যাটটি .pfx এবং .snk নয়, তবে ধাপগুলি একই - সমাধানটিতে ডান ক্লিক করুন এবং বৈশিষ্ট্যগুলি চয়ন করুন। বামে তালিকাভুক্ত ট্যাবগুলি থেকে "সাইনিং" নির্বাচন করুন। চেক বাক্সটি ক্লিক করুন এবং নতুন নির্বাচন করুন ... একটি নাম সরবরাহ করুন! এবং ভোইলা! এটি সম্পন্ন হয়েছে!)
রাজ

58

আমি খুব একই সমস্যার সমাধান অনুসন্ধান করছিলাম এবং আন-টিক টিক দিয়ে "এসেম্বলিতে স্বাক্ষর করুন" বিকল্পটি আমার পক্ষে কাজ করে:

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

(যেমন আপনি লক্ষ্য করতে পারেন স্ক্রিনশটটি ভিএস 2010 থেকে এসেছে তবে আশা করি এটি কাউকে সহায়তা করবে)


আমি আমার এমভিসি প্রকল্পে এই সেটিংটি পরীক্ষা করি না। তবে এটি এখনও একটি নির্ভরতা সম্পর্কে অভিযোগ করে। এমভিসির জন্য কি অন্য কোনও সেটিং আছে?
হামিদ মায়েলি

51

আপনার কাছে সোর্স কোড নেই বা যে প্রকল্পগুলি পরিত্যক্ত হয়েছে সেগুলি সহ আমি স্বয়ংক্রিয়ভাবে শক্তিশালী-নাম সাইন অ্যাসেমব্লিগুলির একটি সরঞ্জাম লিখেছি। এটি বিদ্যমান সরঞ্জামগুলির ত্রুটি বা ত্রুটিগুলি বা তারিখের নির্দেশাবলী ছাড়াই উত্তরে বর্ণিত অনেকগুলি কৌশলকে সহজ উপায়ে ব্যবহার করে।

http://brutaldev.com/post/2013/10/18/NET-Assembly-Strong-Name-Signer

আশা করি এটি হুপসের মধ্য দিয়ে ঝাঁপিয়ে না গিয়ে তৃতীয় পক্ষের অ্যাসেমব্লিকে স্বাক্ষর করতে হবে এমন কাউকে সহায়তা করবে।



23

তৃতীয় পক্ষের সমাবেশে স্বাক্ষর করা আমার পক্ষে কাজ করেছে:

http://www.codeproject.com/Tips/341645/Referenced-assembly-does-not-have-a-strong-name

সম্পাদনা : আমি শিখেছি যে লিঙ্কিত নিবন্ধটি আর বৈধ না হলে পদক্ষেপগুলি পোস্ট করা সহায়ক। সমস্ত কৃতিত্ব হিরেন খিরসারিয়ায় যায় :

  1. ভিজ্যুয়াল স্টুডিও কমান্ড প্রম্পট চালান এবং আপনার ডিএলএল যেখানে অবস্থিত সেই ডিরেক্টরিতে যান।

    For Example my DLL is located in D:/hiren/Test.dll

  2. এখন নীচের কমান্ডটি ব্যবহার করে আইএল ফাইলটি তৈরি করুন।

    D:/hiren> ildasm /all /out=Test.il Test.dll (এই কমান্ডটি কোড লাইব্রেরি উত্পন্ন করে)

  3. আপনার প্রকল্পে স্বাক্ষর করতে নতুন কী তৈরি করুন।

    D:/hiren> sn -k mykey.snk

  4. ilasmকমান্ড ব্যবহার করে আপনার লাইব্রেরি সাইন করুন ।

    D:/hiren> ilasm /dll /key=mykey.snk Test.il


আপনার লিঙ্কটি কৌশলটি তৈরি করেছে! ! ধন্যবাদ এবং এটা ব্যাখ্যা করে mykey.snk তৈরি করার পদ্ধতি (তারা অন্যান্য উত্তর বলে না কিভাবে)
নিকোলাস VERHELST

15

স্বাক্ষরযুক্ত তৃতীয় পক্ষের সমাবেশে কীভাবে স্বাক্ষর করবেন

  1. ভিজ্যুয়াল স্টুডিওর জন্য বিকাশকারী কমান্ড প্রম্পট খুলুন। এই সরঞ্জামটি আপনার উইন্ডো প্রোগ্রামগুলিতে উপলব্ধ এবং ডিফল্ট উইন্ডোজ অনুসন্ধান ব্যবহার করে খুঁজে পাওয়া যাবে।
  2. নিশ্চিত হয়ে নিন যে আপনার প্রম্পটে নিম্নলিখিত সরঞ্জামগুলিতে একবার চালনা করে অ্যাক্সেস পেয়েছে: sn ildasm এবংilasm
  3. আপনার দুর্দান্ত.লিবের.ডিল যে ফোল্ডারে অবস্থিত সেটিতে নেভিগেট করুন
  4. sn –k Cool.Library.snk একটি নতুন কী জুড়ি তৈরি করতে
  5. ildasm Cool.Library.dll /out:Cool.Library.il লাইব্রেরি বিচ্ছিন্ন করতে
  6. move Cool.Library.dll Cool.Library.unsigned.dll আসল গ্রন্থাগারটিকে ব্যাক-আপ হিসাবে রাখতে
  7. ilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk একটি শক্তিশালী নাম দিয়ে লাইব্রেরি পুনরায় সংশ্লেষ করতে
  8. powershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll"সমাবেশ পুরোপুরি যোগ্যতাসম্পন্ন নাম পেতে। আপনার যদি বিটটি দরকার হয় আপনার যদি ওয়েবকনফিগ বা অ্যাপকনফাইগের মতো বাহ্যিক কনফিগারেশন ফাইলগুলিতে ডিএলএল রেফারেন্স করতে হয়।

6

আমার কাছে এই সমস্যাটি এমন একটি অ্যাপ্লিকেশনের জন্য ছিল যা এরপরে দৃ strongly়ভাবে নামকরণ করা হয়েছিল তখন একটি দৃ strongly়ভাবে নামযুক্ত অ্যাসেমব্লিকে রেফারেন্স করার জন্য এটি পরিবর্তন করতে হয়েছিল, তাই আমি প্রকল্পের বৈশিষ্ট্যসমূহ স্বাক্ষরকরণ বিভাগে 'অ্যাসেম্বলিতে স্বাক্ষর করি' বাছাই করেছিলাম তবে এটি এখনও অভিযোগ করেছে। আমি অনুভব করেছি যে এটি কোথাও কোনও সমস্যা তৈরির কারণ হতে হয়েছে যেহেতু আমি অন্য সব কিছু সঠিকভাবে করেছি এবং এটি ঠিক ছিল। আমি লাইনটি খুঁজে পেয়েছি এবং এটি সরিয়েছি: [সমাবেশ: এসেম্বলিকি ফাইলে ("yourkeyfilename.snk")]] এর সমাবেশটিআইএনফো ফাইলগুলি থেকে। তারপরে আর কোনও অভিযোগই নেই।


ধন্যবাদ! আপনার উত্তরের কারণে আমি এটি আমার ইস্যুর (ক্লোজডএক্সএমএল) পুনরায় যাচাই করেছিলাম এবং ক্লোজড এক্সএমএলও পেয়েছি S স্বাক্ষরিত নুগেট প্যাকেজটিও।
কিরিল

6

আমি একটি সার্ভিস স্ট্যাক dll দিয়ে এটিকে চালিয়ে যাচ্ছি আমি নুগেট দিয়ে ইনস্টল করেছিলাম। সরেজমিনে দেখা যাচ্ছে যে আরও একটি ঘড়ির ঘাঁটি উপলভ্য ছিল যা স্বাক্ষরযুক্ত লেবেলযুক্ত ছিল। প্রত্যেকের জন্য উত্তর হতে চলেছে না, তবে আপনাকে কেবল আপনার সমাবেশের বিদ্যমান স্বাক্ষরিত সংস্করণটি পরীক্ষা করতে হবে।ServiceStack.Signed


2

আমার জন্য আমার সমস্যাটি হ'ল আমার কাছে একই সংস্করণ দুটি পৃথক সংস্করণ সহ ইনস্টল করা ছিল Nu


2

"সাইন ইন" ট্যাবের অধীনে "অ্যাসেম্বলিকে স্বাক্ষর করুন" চেক চিহ্ন সরানো @ মিচাল স্টেফানো বলেছিলেন as

আপনার নিজের ফাইল এবং / বা অন্যান্য ব্যক্তির ফাইলগুলিতে সাইন ইন করার সহজ উপায় এখানে যুক্ত করুন। আপনাকে কেবল "পোস্ট-বিল্ড ইভেন্ট কমান্ড লাইন" এর অধীনে এই লাইনটি যুক্ত করতে হবে:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\signtool.exe" sign /f "$(ProjectDir)\YourPfxFileNameHere.pfx" /p YourPfxFilePasswordHere /d "Your software title here" /du http://www.yourWebsiteHere.com /t http://timestamp.verisign.com/scripts/timstamp.dll /v "$(BaseOutputPath)$(TargetFileName)"

আপনি অন্য ব্যক্তির ফাইল বা আপনার নিজের ফাইল এবং যতগুলি চান সাইন করতে পারেন।

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


5
এটি স্বতন্ত্র ধরণের স্বাক্ষর। ওপি যা জিজ্ঞাসা করছে তা হ'ল কীভাবে একটি শক্ত নাম দিয়ে একটি নেট নেট সমাবেশে স্বাক্ষর করতে হয়। আপনি কীভাবে একটি কোড স্বাক্ষরকারী শংসাপত্রের সাথে এক্সিকিউটেবলকে স্বাক্ষর করবেন showing বিভিন্ন জিনিস।
নীল টোক

2

পুরানো প্রশ্ন, তবে আমি অবাক হয়েছি এখনও কেউ ইলমার সম্পর্কে উল্লেখ করেনি। ইলিমার মাইক্রোসফ্ট থেকে আসে তবে ভিএস বা এসডিকে দিয়ে পাঠানো হয় না। আপনি থেকে এটা বিনামূল্যে ডাউনলোড করতে পারেন এখানে যদিও। এখানে একটা হয় GitHub সংগ্রহস্থল। আপনি নুগেট থেকেও ইনস্টল করতে পারেন:

PM>Install-Package ilmerge

ব্যবহার করা:

ilmerge assembly.dll /keyfile:key.snk /out:assembly.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug

যদি প্রয়োজন হয়, আপনি sn (VS থেকে) ব্যবহার করে নিজের কীফাইল তৈরি করতে পারেন:

sn -k key.snk

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

1> Register-PackageSource -ProviderName NuGet -Name NuGet -Location http://www.nuget.org/api/v2
ফ্রান্সোইস

2> Install-Package -Name ILMerge
ফ্রান্সোইস

3> $env:path += ';C:\Program Files\PackageManagement\NuGet\Packages\ilmerge.2.14.1208\tools'
ফ্রান্সোইস

4> ILMerge.exe .\packages\WireMock.Net.1.0.4.2\lib\net452\WireMock.Net.dll /keyfile:key.snk /out:WireMock.Net.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug /lib:.\packages\Newtonsoft.Json.10.0.3\lib\net45\ /lib:.\packages\Handlebars.Net.1.9.0\lib\net40 /lib:.\packages\SimMetrics.Net.1.0.4\lib\net45 /lib:.\packages\Microsoft.Owin.2.0.2\lib\net45 /lib:.\packages\Owin.1.0\lib\net40 /lib:.\packages\Microsoft.Owin.Hosting.2.0.2\lib\net45 /lib:.\packages\MimeKitLite.2.0.1\lib\net45 /lib:.\packages\XPath2.1.0.5.1\lib\net40 /lib:.\packages\RestEase.1.4.4\lib\net45
ফ্রান্সোইস

1

পরিস্থিতি: আপনার এক্স, ওয়াই সলিউশন এ, বি, সি, ডি প্রকল্প ছিল

প্রজেক্ট এ, বি, সি, এক্স প্রকল্প এ, সি, ডি-এ

আমার প্রজেক্ট এ তে প্রকল্প সি ব্যবহার করা দরকার তবে পরে আমি ব্যবহার করব না। বিন ডিবাগ প্রজেক্টে এ এর ​​সিডিএল ছিল।

আমি যদি সমাধান এক্স সংকলন করি তবে সমস্ত ভাল (এই সমাধানে আমি রেফারেন্স এ -> সি মুছে ফেলব), তবে সমাধানে YI এই সমস্যাটি পান।

সলিউশনটি এড ডিবেগ প্রকল্পে সিডিলি মোছা হয়


0

আপনার সলিউশনের সমস্ত প্রকল্প জুড়ে সমস্ত নুগেট প্যাকেজগুলি একই সংস্করণে রয়েছে তা নিশ্চিত করুন। যেমন আপনি একটি প্রকল্প NLog 4.0.0.0 এবং অন্য প্রকল্প NLog 4.1.0.0 উল্লেখ করতে চান না। তারপরে nuget প্যাকেজগুলি পুনরায় ইনস্টল করার চেষ্টা করুন

আপডেট-প্যাকেজ -ইনস্টল

আমার 3 য় পক্ষের অ্যাসেম্বলিগুলি ছিল যেগুলি আমার অ্যাসেম্বলি এ দ্বারা রেফারেন্স করা হয়েছিল এবং আমার সমাবেশ বি দ্বারা রেফারেন্সগুলিতে কেবল 2 টি অন্তর্ভুক্ত ছিল যা এ-কেও রেফারেন্স করেছিল B

আপডেট প্যাকেজ কমান্ড দ্বারা তৃতীয় পক্ষের সমাবেশের অনুপস্থিত রেফারেন্স যুক্ত করা হয়েছিল এবং ত্রুটিটি চলে গেছে।

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