.नेट असेंबली की PublicKeyToken हो रही है


163

किसी विधानसभा की पब्लिक-की-टोकन को खोजने का सबसे सरल तरीका क्या है?

मैं जिस सरल तरीके के बारे में सोच सकता हूं वह एक साधारण राइट-क्लिक होगा, सार्वजनिक कुंजी प्राप्त करेगा, लेकिन यह कार्यक्षमता नहीं है, हो सकता है कि इसके लिए एक विजुअल स्टूडियो एक्सटेंशन हो?

मैं Visual Studio 2010 का उपयोग कर रहा हूँ, अगर कोई एक्सटेंशन उपलब्ध है।


4
Kirk इवांस की इस ब्लॉग पोस्ट को देखें कि Visual Studio के भीतर एक असेंबली का PublicKeyToken कैसे प्राप्त करें: blogs.msdn.com/b/kaevans/archive/2008/06/18/…
मार्टिन बुबेरल

2
बस EF6 स्थापित किया गया है और ईमानदारी से यह भी नहीं पता है कि विधानसभाएं कहां स्थित हैं। इस तरह बकवास मेरे दिन के घंटे लगते हैं।
फ्रॉग्गीइन्फ्रॉग

जवाबों:


228

एक कमांड प्रॉम्प्ट खोलें और अपने विज़ुअल स्टूडियो संस्करण और ऑपरेटिंग सिस्टम आर्किटेक्चर के अनुसार निम्न में से एक लाइन टाइप करें:

32bit विंडोज पर वीएस 2008 :

"%ProgramFiles%\Microsoft SDKs\Windows\v6.0A\bin\sn.exe" -T <assemblyname>

64 बिट विंडोज पर वीएस 2008:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v6.0A\bin\sn.exe" -T <assemblyname>

32bit विंडोज पर वीएस 2010:

"%ProgramFiles%\Microsoft SDKs\Windows\v7.0A\bin\sn.exe" -T <assemblyname>

64bit विंडोज पर वीएस 2010:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.0A\bin\sn.exe" -T <assemblyname>

32bit विंडोज पर वीएस 2012:

"%ProgramFiles%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>

64bit विंडोज पर वीएस 2012:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>

64 बिट विंडोज पर वीएस 2015:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\sn.exe" -T <assemblyname>

ध्यान दें कि संस्करणों के लिए VS2012 +, sn.exe अनुप्रयोग अब बिन में नहीं बल्कि उप-फ़ोल्डर में है। इसके अलावा, ध्यान दें कि 64 बिट के लिए आपको (x86) फ़ोल्डर निर्दिष्ट करने की आवश्यकता है।

यदि आप Visual Studio कमांड प्रॉम्प्ट का उपयोग करना पसंद करते हैं, तो बस टाइप करें:

sn -T <assembly> 

जहाँ <assemblyname>आप रुचि रखते हैं, विधानसभा के लिए एक पूर्ण फ़ाइल पथ है जहाँ यह रिक्त स्थान है, तो उद्धरणों से घिरा हुआ है।

आप इसे वी.एस. में एक बाहरी उपकरण के रूप में जोड़ सकते हैं, जैसा कि यहाँ दिखाया गया है:
http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token -किसी एक stong नाम-assembly.aspx


1
हाँ, मुझे पता है कि, मैं एक आसान तरीका ढूंढ रहा हूँ, अधिमानतः वीएस छोड़ने के बिना
moi_meme

12
यदि आप 64-बिट मशीन पर हैं, तो% ProgramFiles (x86)% के साथ% ProgramFiles% बदलें।
System.Cats.Lol

1
VS2012 के लिए यह अधीन है "%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>। नोट Sn को बिन के बाद एक अतिरिक्त फ़ोल्डर स्तर में (NETFX 4.0 उपकरण में) टक किया गया है।
जीडीएस

2
अच्छा विस्तृत जवाब। VS2015 के लिए यह% ProgramFiles (x86)% \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 टूल्स \ sn.exe के तहत होना चाहिए
ThePatelGuy

1
VS2015 पथ v10.0A होना चाहिए, न कि V1.0A
माइकल इट्ज़ो

87

एक अन्य विकल्प:

यदि आप PowerShell का उपयोग करते हैं, तो आप यह पता लगा सकते हैं:

PS C:\Users\Pravat> ([system.reflection.assembly]::loadfile("C:\Program Files (x86)\MySQL\Connector NET 6.6.5\Assemblies\v4.0\MySql.Data.dll")).FullName

पसंद

PS C:\Users\Pravat> ([system.reflection.assembly]::loadfile("dll full path")).FullName

और जैसे दिखाई देगा

MySql.Data, संस्करण = 6.6.5.0, संस्कृति = तटस्थ, PublicKeyToken = c5687fc88969c44d


बहुत बढ़िया, अगर मैं मैन्युअल रूप से असेंबलियों को जोड़ रहा हूं तो मुझे पूरे परिणाम को सीधे एक वेब कॉन्फ़िगरेशन में कॉपी और पेस्ट करने देता है। धन्यवाद!
GJKH

महान उत्तर, जैसा कि आप संस्करण को भी प्राप्त कर सकते हैं (जो समस्या निवारण के लिए महत्वपूर्ण हो सकता है)।
sbkrogers

48

यदि पुस्तकालय वीएस परियोजना में शामिल है, तो आप .cprojफ़ाइल की जांच कर सकते हैं, जैसे:

<ItemGroup>
    <Reference Include="Microsoft.Dynamic, Version=1.1.0.20, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL">
...

2
मैं केवल <संदर्भ शामिल देखें = "System.IdentityModel" /> (अन्य asseblies के लिए एक ही)
FrenkyB

.NET सिस्टम लाइब्रेरी में असेंबली के लिए बहुत अधिक उपयोग नहीं लगता है। उदाहरण के लिए System.Configuration यह सिर्फ कहता है<Reference Include="System.Configuration" />
सिमोन टेवेसी

ऐसा लगता है कि सभी विधानसभाओं में समान है PublicKeyToken, इसलिए .cprojसबसे आसान समाधान लगता है।
asdf

14

यदि आपने अपनी परियोजना में विधानसभा को शामिल किया है, तो आप यह कर सकते हैं:

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


            foreach (var assem in assemblies)
            {
                    Console.WriteLine(assem.FullName);
            }

यह मेरे संदर्भ में dll के सार्वजनिक कुंजी टोकन नहीं मिल रहा है। क्या आपकी विधि वास्तव में एक निश्चित परियोजना के संदर्भ में सभी dll हो जाती है? धन्यवाद
फ्रांसिस शाऊल

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

यह सबसे सरल तरीका था जो मेरे लिए काम करता था। इसे और सरल बनाया जा सकता है: एक विराम बिंदु सेट के साथ एप्लिकेशन को चलाएं। जब निष्पादन ब्रेकपॉइंट पर रुक जाता है, तो वीएस तत्काल विंडो प्रकार में AppDomain.CurrentDomain.GetAssemblies():। यह प्रत्येक के लिए संस्करण, संस्कृति और PublicKeyToken के साथ तत्काल विंडो में भरी हुई विधानसभाओं को सूचीबद्ध करेगा।
साइमन टेवेसी

यह 'सी # इंटरएक्टिव' में चलाना संभव है - कोई संकलन की आवश्यकता नहीं है!
bTab

13

आप इसे आसानी से c # के माध्यम से प्राप्त कर सकते हैं

private static string GetPublicKeyTokenFromAssembly(Assembly assembly)
{
    var bytes = assembly.GetName().GetPublicKeyToken();
    if (bytes == null || bytes.Length == 0)
        return "None";

    var publicKeyToken = string.Empty;
    for (int i = 0; i < bytes.GetLength(0); i++)
        publicKeyToken += string.Format("{0:x2}", bytes[i]);

    return publicKeyToken;
}

मैंने आपका कोड आज़माया लेकिन यह काम नहीं कर रहा है। मैं Stimulsoft.Report.Web.dll का सार्वजनिक कुंजी टोकन प्राप्त करना चाहता हूं जो पहले से ही मेरे संदर्भ में है। मैंने आपका कोड कॉपी किया और dll का नाम दिया लेकिन यह काम नहीं कर रहा है। मेरा कोड कुछ इस तरह से है: string s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web")। स्पष्ट रूप से विधि विधानसभा को स्वीकार कर रही है, न कि एक स्ट्रिंग नाम। क्या आप अपनी विधि का उपयोग करने में मेरी मदद कर सकते हैं?
फ्रांसिस शाऊल

@FrancisSaul क्या विधि वापस आती है, "कोई नहीं" या एक गलत मूल्य? क्या आपने निर्धारित किया है कि विधानसभा वास्तव में मजबूत नाम है? आप संदर्भ (मजबूत नाम) के लिए गुण पैनल पर वीएस में सत्यापित कर सकते हैं। आप JustDecompile जैसे अधिकांश नि: शुल्क डिकंपाइलर्स के साथ भी इसे आसानी से जांच सकते हैं। यदि आप देखते हैं कि यह मजबूत नाम है, तो कोड को डिबग करें और बाइट्स का निरीक्षण करें।
एडम कैविनेस

कोड स्ट्रिंग s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web") टाइप करने के बाद, मैं प्रोजेक्ट नहीं चला सकता, यह कहता है कि विधि के लिए सबसे अच्छा अधिभार में अमान्य तर्क हैं।
फ्रांसिस शाऊल

@FrancisSaul आप एक स्ट्रिंग तर्क को एक विधि से गुजार रहे हैं जो असेंबली लेता है। यदि आप चाहें, तो आप इसे विधि को पास typeof(YourPreferredTypeInThatAssembly).Assemblyया Assembly.GetAssembly(typeof(YourPreferredTypeInThatAssembly))पास कर सकते हैं।
एडम कैविनेस

तो वाक्य रचना इस तरह होगी। असेम्बली.गेटअवेशन (टाइपोफ़ ("स्टिमुलसॉफ्ट.पोर्ट.वेब.डेल));
फ्रांसिस शाऊल

9

आप इसे एक बाहरी उपकरण के रूप में विज़ुअल स्टूडियो में जोड़ सकते हैं:

शीर्षक:

Get PublicKeyToken

कमान:

c:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\sn.exe

(पथ संस्करणों के बीच भिन्न हो सकते हैं)

तर्क:

-T "$(TargetPath)"

और " आउटपुट विंडो का उपयोग करें " विकल्प की जांच करें


1
जब आप Toolsइसे मेनू से चुनते हैं , तो यह आपके द्वारा सोल्यूशन एक्सप्लोरर में चुने गए प्रोजेक्ट पर स्वचालित रूप से काम करेगा।
कंटैंगो

मैंने अपना नाम बदल दिया Get PublicKeyToken on Solution Explorer Selection
कंटैंगो

1
अच्छा उत्तर! संकेत: यदि आप चेकबॉक्स को "वाद-विवाद के लिए प्रेरित करें" सक्षम करते हैं, तो एक डायलॉग खुलता है, जिससे आप इसमें एक पथ पेस्ट कर सकते हैं। इसलिए आप उदाहरण के लिए वहाँ गुण विंडो से एक assemly पथ कॉपी + पेस्ट कर सकते हैं। यह मेरे लिए बहुत उपयोगी था, खासकर जब मुझे web.config में पंजीकरण बदलना पड़ा और एक DLL सार्वजनिक कुंजी टोकन नहीं पता था।
मैट

8

मेरे लिए सबसे सरल तरीका ILSpy का उपयोग करना है

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

(मुझे यह भी लगता है कि नए संस्करण हस्ताक्षर की सार्वजनिक कुंजी भी प्रदर्शित करेंगे, यदि आपको कभी भी उस एक की आवश्यकता हो ... तो यहां देखें: https://github.com/icsharpcode/ILSpy/issues/610#issuecomment-111189894 । अच्छी चीज़! ;))


5

1) कमांड है C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\sn -T {your.dll}

उपरोक्त उदाहरण में, Microsoft SDK C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A में रहता है। आपका वातावरण अलग हो सकता है।

2) अपने किसी भी प्रोजेक्ट के सार्वजनिक कुंजी टोकन प्राप्त करने के लिए, आप अपने स्टूडियो में Visual Studio के भाग के रूप में sn.exe जोड़ सकते हैं। चरण इस Microsoft लिंक में दिखाए गए हैं : कैसे करें: किसी असेंबली की सार्वजनिक कुंजी प्राप्त करने के लिए एक उपकरण बनाएँ


हाँ, मुझे पता है कि, मैं एक आसान तरीका ढूंढ रहा हूं, अधिमानतः वीएस छोड़ने के बिना
moi_meme

5

अगर कोई असेंबली सार्वजनिक कुंजी की तलाश में था (मेरे जैसे), सार्वजनिक कुंजी टोकन नहीं - sn.exe का उपयोग करना महान काम करता है, इसके अलावा आपको -Tp स्विच का उपयोग करना होगा, जो सार्वजनिक कुंजी और सार्वजनिक कुंजी टोकन दोनों को वापस कर देगा - और पर https://msdn.microsoft.com/en-us/library/office/ee539398(v=office.14).aspx


5

एक विकल्प के रूप में, आप linqइस तरह का भी उपयोग कर सकते हैं -

    string key = string.Join ("",assembly
                                .GetName()
                                .GetPublicKeyToken()
                                .Select (b => b.ToString ("x2")));

1
उन्होंने सार्वजनिक कुंजी टोकन के लिए कहा। आपका कोड सार्वजनिक कुंजी का उपयोग करता है। यह होना चाहिए.GetPublicKeyToken()
स्टीफन बॉर्न

1

एक वैकल्पिक विधि होगी यदि आपके पास डिकम्पाइलर है, तो बस इसे वहां देखें, वे आमतौर पर सार्वजनिक कुंजी प्रदान करते हैं। मैंने .Net परावर्तक, टेलरिक जस्ट डेकोम्पाइल और ILSpy को देखा है, बस डिकम्पाइल वे सार्वजनिक कुंजी टोकन प्रदर्शित करते हैं।


1

एक अन्य विकल्प इसके लिए ओपन सोर्स टूल नुगेट पैकेज एक्सप्लोरर का उपयोग करना है ।

Nuget पैकेज (.nupkg) से आप PublicKeyToken की जांच कर सकते हैं, या टूल में बाइनरी (.dll) को खींच सकते हैं। बाद के लिए पहले "फाइल -> नया" चुनें

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


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