"संदर्भित विधानसभा में एक मजबूत नाम नहीं है" त्रुटि को ठीक करने के लिए कैसे?


242

मैंने अपने विजुअल स्टूडियो 2005 प्रोजेक्ट (जिसे दृढ़ता से नाम दिया गया है) में एक कमजोर नाम वाली असेंबली जोड़ी है । अब मुझे त्रुटि मिल रही है:

"संदर्भित विधानसभा 'xxxxxxxx' में एक मजबूत नाम नहीं है"

क्या मुझे इस तीसरे पक्ष की विधानसभा पर हस्ताक्षर करने की आवश्यकता है?



1
यह एक मूर्खतापूर्ण टिप की तरह लग सकता है लेकिन अगर आप पाते हैं कि आपकी असेंबली पर हस्ताक्षर नहीं हो रहे हैं, तो आप अपनी बिल्ड सेटिंग्स की जाँच करें। याद रखें कि जब आप पुनर्निर्माण / स्वच्छ करते हैं, तो VS अन्य आर्किटेक्चर (कोई भी CPU, x64, आदि) को साफ नहीं करता है, इसलिए आप किसी अन्य आर्किटेक्चर से एक पुराने dll को देख सकते हैं।
जूनियर

जवाबों:


213

इस त्रुटि से बचने के लिए आप या तो:

  • विधानसभा को गतिशील रूप से लोड करें, या
  • तीसरे पक्ष के विधानसभा पर हस्ताक्षर करें।

आपको .NET-fu में थर्ड-पार्टी असेंबलियों पर हस्ताक्षर करने के निर्देश मिलेंगे : एक असेंबली असेंबली (बिना विलंब हस्ताक्षर) पर हस्ताक्षर किए

तृतीय-पक्ष विधानसभाओं पर हस्ताक्षर

तेरह-पक्ष पर हस्ताक्षर करने का मूल सिद्धांत है

  1. ildasm.exeइंटरमीडिएट भाषा (IL) का उपयोग करके असेंबली को अलग करें :

    ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll 
  2. विधानसभा का पुनर्निर्माण और हस्ताक्षर करें:

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

अतिरिक्त संदर्भ तय करना

जब तक आपकी तृतीय-पक्ष असेंबली ( A.dll ) किसी अन्य लायब्रेरी ( B.dll ) का संदर्भ नहीं देती है, तब तक उपरोक्त चरण ठीक काम करते हैं, जिस पर हस्ताक्षर भी करने होते हैं। उपरोक्त आदेशों का उपयोग करके आप A.dll और B.dll दोनों को अलग कर सकते हैं, पुनर्निर्माण कर सकते हैं और साइन इन कर सकते हैं , लेकिन रनवे पर, B.dll की लोडिंग विफल हो जाएगी क्योंकि A.dll मूल रूप से B.dll के अहस्ताक्षरित संस्करण के संदर्भ में बनाया गया था ।

इस समस्या का समाधान चरण 1 में उत्पन्न IL फ़ाइल को ऊपर करना है। आपको संदर्भ में 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 का IL खोजना होगा और टोकन को इस प्रकार जोड़ना होगा:

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

2
इस प्रकार विधानसभा पर एक विकल्प पर हस्ताक्षर कर रहा है, मैं न तो विधानसभा को गतिशील रूप से लोड करना चाहता हूं और न ही इस पर हस्ताक्षर करना चाहता हूं। मुझे पता है कि मजबूत नामकरण ग्लोबल असेंबली कैश (जीएसी) के संबंध में है। इसके बावजूद, मैं अपनी विधानसभाओं को GAC का हिस्सा नहीं बनाना चाहता और न ही वे COM-दृश्यमान हैं। मुझे आंशिक रूप से याद है कि हम कुछ ऐसा कर सकते हैं जो इस विधानसभा के उपयोग को बिना हस्ताक्षर किए करने की अनुमति देगा। यह कहीं न कहीं विकल्प गुणों में है। क्या मैं उस रास्ते से जाना चाहता हूँ?
बजे विल मार्कॉइलर

27
यदि आपकी असेंबली भी अहस्ताक्षरित है, तो आप अहस्ताक्षरित असेंबली का उपयोग कर सकते हैं।
ओ जे।

2
.NET-fu का लिंक एक भयानक संसाधन है
TheDude

2
यद्यपि उपरोक्त चरण "सबसे" स्थितियों में काम करेंगे, यह अविश्वसनीय रूप से समय लेने वाली और त्रुटि प्रवण है और अन्य चीजों के बीच मित्र विधानसभा संदर्भों के साथ विफल रहता है। बस इस उपयोगिता का उपयोग यह सब अपने आप करने के लिए करें (बेशर्म प्लग): stackoverflow.com/a/19459609/564726
BrutalDev

1
@Roel मैंने यहां प्रक्रिया विस्तृत की है delabs.io/the-12th-labor-of-a-net-developer-part-4
TheDude

98

उस प्रोजेक्ट फ़ाइल का विस्तार करें जो उस प्रोजेक्ट का उपयोग कर रही है जिसमें "एक मजबूत नाम कुंजी नहीं है" और .snkफ़ाइल (.StrongNameKey) की तलाश करें।

विंडोज एक्सप्लोरर में इस फाइल के माध्यम से ब्राउज़ करें (बस इतना है कि आप जानते हैं कि यह कहां है)।

बैक इन विजुअल स्टूडियो प्रोजेक्ट में "एक मजबूत नाम कुंजी नहीं है", करते हैं

  • प्रोजेक्ट फ़ाइल पर राइट क्लिक करें
  • गुण का चयन करें
  • "साइनिंग टैब" चुनें (बाईं ओर)
  • चेक बॉक्स पर क्लिक करें "विधानसभा पर हस्ताक्षर करें"
  • फिर आपको <Browse>जो .snkफ़ाइल पहले मिली थी

यह ट्रिक काम आना चाहिए। इसने मेरे लिए एक प्रॉजेक्ट के लिए एक प्रॉब्लम हल की और उसी सॉल्यूशन में दूसरे प्रोजेक्ट के अंदर एक फॉर्म का इस्तेमाल किया।

मुझे उम्मीद है यह मदद करेगा।


अगर मैं अपनी विधानसभा पर हस्ताक्षर नहीं करना चाहता था तो मैंने शुरू से ही इस पर हस्ताक्षर नहीं किए थे!
मुहस

यदि आपको .snk-file नहीं मिलती है: प्रोजेक्ट गुण ("मजबूत नाम" त्रुटि के साथ प्रोजेक्ट का उपयोग करके), टैब साइनिंग खोलें। वहां आपको प्रोजेक्ट पर हस्ताक्षर करने के लिए उपयोग की गई फ़ाइल दिखाई देगी (यह हमेशा .snk एक्सटेंशन वाली फ़ाइल नहीं है)। बस इस सेटिंग को दूसरे प्रोजेक्ट पर कॉपी करें।
कोडर 14

जैसा कि MrOli3000 बताते हैं, यह केवल तभी काम करता है जब कोई एक समाधान है जो मजबूत नाम कुंजी फ़ाइल को याद कर रहा है। यदि कई परियोजनाएं हैं जो अहस्ताक्षरित परियोजना को संदर्भित करती हैं, तो आप किसी भी संघर्ष से बचने के लिए एक नई मजबूत नाम कुंजी फ़ाइल बनाने से बेहतर हैं। मेरे मामले में, समाधान का निर्माण नहीं हुआ, और मैं ठीक करने की कोशिश कर रहे हलकों में जा रहा था। VS2017 के अनुसार, प्रारूप .pfx और ssnk नहीं है, लेकिन चरण समान हैं - समाधान पर राइट क्लिक करें और गुण चुनें। बाईं ओर सूचीबद्ध टैब से, "हस्ताक्षर" चुनें। चेक बॉक्स पर क्लिक करें और नया चुनें ... एक नाम प्रदान करें! और वोइला! यह पूरा हो गया है!)
राज

59

मैं उसी समस्या के समाधान के लिए खोज कर रहा था और मेरे लिए "असेंबली साइन करें" विकल्प काम करता है:

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

(जैसा कि आप देख सकते हैं कि स्क्रीनशॉट VS2010 से आया है लेकिन उम्मीद है कि यह किसी की मदद करेगा)


मैं अपने MVC प्रोजेक्ट में इस सेटिंग की जाँच नहीं करता। लेकिन यह अभी भी निर्भरता में से एक के बारे में शिकायत कर रहा है। क्या MVC के लिए कोई अन्य सेटिंग है?
हामिद मायेली

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. दृश्य स्टूडियो कमांड प्रॉम्प्ट चलाएं और उस निर्देशिका पर जाएं जहां आपका DLL स्थित है।

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

  2. अब नीचे कमांड का उपयोग करके IL फाइल बनाएं।

    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. उस फ़ोल्डर पर नेविगेट करें जहां आपका Cool.Library.dll स्थित है
  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"विधानसभा पूरी तरह से योग्य नाम पाने के लिए। अगर आपको बाहरी विन्यास फाइल जैसे कि web.config या app.config में DLL को संदर्भित करना है तो आपको इसकी आवश्यकता होगी।

6

मेरे पास इस मुद्दे के लिए एक ऐप था जिसे दृढ़ता से नामित किया गया था, फिर इसे गैर-दृढ़ता से नामित विधानसभा का संदर्भ देने के लिए बदलना पड़ा, इसलिए मैंने प्रोजेक्ट गुण साइनिंग अनुभाग में 'असेंबली साइन करें' को अनियंत्रित किया लेकिन फिर भी इसकी शिकायत की। मुझे लगा कि यह कहीं न कहीं एक विरूपण साक्ष्य है, क्योंकि मैंने समस्या को सब कुछ सही ढंग से किया और बस यही था। मैंने अपनी विधानसभाInfo.cs फ़ाइल से लाइन को पाया: [विधानसभा: असेम्बलीकेयफाइल ("yourkeyfilename.snk") को हटा दिया। फिर उसके बाद कोई शिकायत नहीं।


धन्यवाद! आपके उत्तर के कारण मैं इसे अपने अंक (ClosedXML) के लिए पुन: जाँचता हूँ और ClosedXML.Sign नुगेट पैकेज भी पाया।
किरील

6

मैं एक सर्विसस्टैक dll के साथ चल रहा था जिसे मैंने nuget के साथ स्थापित किया था। पता चलता है कि वहाँ dlls का एक और सेट उपलब्ध था जिस पर हस्ताक्षर किए गए थे। हर किसी के लिए जवाब नहीं होने जा रहा है, लेकिन आपको बस अपने विधानसभा के मौजूदा हस्ताक्षरित संस्करण की जांच करनी होगी।ServiceStack.Signed


2

मेरे लिए मेरा मुद्दा यह था कि मेरे पास एक ही NuGet पैकेज के दो अलग-अलग संस्करणों के साथ स्थापित थे।


2

निकाला जा रहा है "विधानसभा साइन इन करें" के तहत जाँच चिह्न "प्रवेश करना" @Michal Stefanow के रूप में काम करता है टैब कहा।

यहाँ जोड़ें अपनी फ़ाइलों और / या अन्य लोगों की फ़ाइलों पर हस्ताक्षर करने का सबसे सरल तरीका है। आपको बस "पोस्ट-बिल्ड इवेंट कमांड लाइन" के तहत इस लाइन को जोड़ना होगा:

"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
यह एक अलग तरह का हस्ताक्षर है। ओपी क्या पूछ रहा है कि एक मजबूत नाम के साथ एक .NET असेंबली पर हस्ताक्षर कैसे करें। आप दिखा रहे हैं कि एक कोड हस्ताक्षर प्रमाण पत्र के साथ एक निष्पादन योग्य पर हस्ताक्षर कैसे करें। अलग अलग बातें।
ब्लू टूक

2

पुराना सवाल है, लेकिन मुझे आश्चर्य है कि किसी ने भी ilmerge का उल्लेख नहीं किया है। ilmerge Microsoft से है, लेकिन VS या SDK के साथ शिप नहीं किया गया है। आप इसे यहाँ से डाउनलोड कर सकते हैं । एक गीथूब भंडार भी है। तुम भी nuget से स्थापित कर सकते हैं:

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
मुझे वायरमॉक.नेट के साथ मुद्दा था, आखिरकार यह काम कर गया, लेकिन मुझे पॉवरशेल कमांड का पता लगाने में थोड़ा समय लगा। विशेष रूप से अंत में असेंबली पर हस्ताक्षर करने के लिए ILMerge को प्राप्त करने के लिए संपूर्ण / दलील दलीलों का पूरा गुच्छा।
फ्रांस्वा

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

स्थिति: आपके पास ए, बी, सी, डी समाधान में एक्स, वाई था

प्रोजेक्ट ए, बी, सी में एक्स प्रोजेक्ट ए, सी, डी में वाई

मुझे प्रोजेक्ट A में प्रोजेक्ट C का उपयोग करने की आवश्यकता है, लेकिन बाद में मुझे उपयोग नहीं करना है। बिन डिबग परियोजना में A में C.dll था।

यदि मैं समाधान X संकलित करता हूं, तो सभी अच्छे (इस समाधान में मैं संदर्भ A -> C. हटाता हूं), लेकिन समाधान में YI को यह समस्या मिलती है।

समाधान एक बिन डीबग परियोजना में C.dll को हटा देता है


0

पहले सुनिश्चित करें कि आपके समाधान में सभी परियोजनाओं के सभी नगेट पैकेज एक ही संस्करण में हैं। उदाहरण के लिए, आप NLog 4.0.0.0 के संदर्भ में एक प्रोजेक्ट नहीं चाहते हैं और NLog 4.1.0.0 के संदर्भ में एक अन्य प्रोजेक्ट चाहते हैं। फिर के साथ nuget संकुल को पुनः स्थापित करने का प्रयास करें

अद्यतन-पैकेज-स्थापना रद्द करें

मेरे पास 3 3 पार्टी असेंबली थीं जिन्हें मेरे विधानसभा ए द्वारा संदर्भित किया गया था और केवल 2 को मेरी विधानसभा बी द्वारा संदर्भ में शामिल किया गया था जिसमें ए का भी उल्लेख था।

तृतीय पक्ष असेंबली का अनुपलब्ध संदर्भ अद्यतन पैकेज कमांड द्वारा जोड़ा गया था, और त्रुटि चली गई।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.