c# - "संदर्भित असेंबली में कोई मजबूत नाम नहीं है" त्रुटि कैसे ठीक करें?




visual-studio-2005 assemblies (8)

एक हस्ताक्षरित तृतीय-पक्ष असेंबली पर हस्ताक्षर कैसे करें

  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 को 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 का संदर्भ देना है, तो आपको इस बिट की आवश्यकता होगी।

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

"संदर्भित असेंबली 'xxxxxxxx' का कोई मजबूत नाम नहीं है"

क्या मुझे इस तीसरे पक्ष की असेंबली पर हस्ताक्षर करने की ज़रूरत है?


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

  • असेंबली गतिशील रूप से लोड करें, या
  • तीसरे पक्ष की असेंबली पर हस्ताक्षर करें।

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

थर्ड पार्टी असेंबली पर हस्ताक्षर करना

एक थिंक पार्टी पर हस्ताक्षर करने के लिए मूल सिद्धांत है

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

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

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

अतिरिक्त संदर्भ फिक्सिंग

उपर्युक्त चरण तब तक ठीक काम करते हैं जब तक कि आपकी तृतीय-पक्ष असेंबली ( एडीएल ) किसी अन्य लाइब्रेरी ( बीडीएल ) का संदर्भ न दे, जिसे भी हस्ताक्षर करना होगा। आप उपरोक्त आदेशों का उपयोग करके 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 के संदर्भ के लिए IL of A.dll खोजना होगा और टोकन को निम्नानुसार जोड़ें:

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

तीसरे पक्ष की असेंबली पर हस्ताक्षर करने के लिए मेरे लिए काम किया:

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 For Example my DLL is located in

  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


पुराना सवाल, लेकिन मुझे आश्चर्य है कि किसी ने अभी तक इमरज का उल्लेख नहीं किया है। ilmerge माइक्रोसॉफ्ट से है, लेकिन वीएस या एसडीके के साथ भेज दिया नहीं है। हालांकि आप इसे here से डाउनलोड कर सकते हैं। एक github भंडार भी है। आप 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

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


मैं इसे सर्विसस्टैक डीएल के साथ चला रहा था जिसे मैंने न्यूजेट के साथ स्थापित किया था। बाहर निकलते हुए डीएलएस का एक और सेट उपलब्ध था जिसे हस्ताक्षरित किया गया था। सभी के लिए जवाब नहीं होने वाला है, लेकिन आपको बस अपनी असेंबली के मौजूदा हस्ताक्षरित संस्करण की जांच करनी होगी।


मैंने स्वचालित रूप से मजबूत-नाम चिह्न असेंबली के लिए एक टूल लिखा है जिसमें आपके पास स्रोत कोड या परियोजनाओं को छोड़ दिया गया है, जिनके पास छोड़ दिया गया है। यह किसी भी प्रकार की त्रुटियों या मौजूदा उपकरणों या दिनांकित निर्देशों की कमी के बिना उत्तर में वर्णित कई तकनीकों का उपयोग करता है।

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

उम्मीद है कि यह किसी भी व्यक्ति की मदद करता है जिसे वहां पहुंचने के लिए हुप्स के माध्यम से कूदने के बिना किसी तीसरे पक्ष की असेंबली पर हस्ताक्षर करने की आवश्यकता होती है।


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





signing