मैं एक विशेष dll के लिए PublicKeyToken को कैसे ढूँढूँ?


197

मुझे अपनी web.config फ़ाइल में एक प्रदाता को फिर से बनाना होगा जो कुछ इस तरह दिखता है:

<membership defaultProvider="AspNetSqlMemProvider">
  <providers>
    <clear/>
    <add connectionStringName="TRAQDBConnectionString" applicationName="TRAQ" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="0"
         name="AspNetSqlMemProvider"
         type="System.Web.Security.SqlMembershipProvider, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"
    />
  </providers>
</membership>

हालाँकि, मुझे यह कहते हुए एक रनटाइम त्रुटि मिली कि यह असेंबली लोड नहीं की जा सकती है, और मुझे लगता है कि यह इसलिए है क्योंकि मेरे पास गलत PublicKeyToken है। मैं अपनी विधानसभा के लिए PublicKeyToken कैसे देखूं?

वैकल्पिक रूप से, क्या मैं इसके साथ पूरी तरह से गलत तरीके से जा रहा हूं?


जवाबों:


283

PowerShell का उपयोग करके , आप इस कथन को निष्पादित कर सकते हैं:

([system.reflection.assembly]::loadfile("c:\MyDLL.dll")).FullName

आउटपुट संस्करण , संस्कृति और PublicKeyToken प्रदान करेगा जैसा कि नीचे दिखाया गया है:

MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a

1
धन्यवाद! आपकी विधि केवल एक ही है जो मेरे लिए काम करती है sn -T dllname.dll केवल तभी पाठ दिखाएगा जब मैंने इसे चलाया था
Vdex

1
यह बिल्कुल सही है! अतिरिक्त उपकरण स्थापित करने से बचा जाता है।
नीरव

1
महान! यह तब भी काम करता है जब कोई PublicKeyToken उपलब्ध नहीं है (यानी अहस्ताक्षरित असेंबली)
MovGP0

2
C # इंटरएक्टिव में, आप कॉल कर सकते हैं: Console.WriteLine (System.Reflection.Assembly.LoadFile (@ "c: \ some.dll")। FullName);
अरी रहीमज़ादेह

2
अनायास, PowerShell.exe कॉल पूरा होने के बाद भी dll पर एक लॉक रखता है। इससे पहले कि मैं अपना समाधान दोबारा बना पाऊं, मुझे PowerShell कंसोल को बंद करने की आवश्यकता है।
Cee McSharpface

141

Sn.exe उपयोगिता का उपयोग करना :

sn -T YourAssembly.dll

या रिफ्लेक्टर में असेंबली लोड करना ।


31
sn.exe आमतौर पर C: \ Program Files (x86) \ Microsoft SDKs \ Windows: C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin, C: के अंतर्गत निम्न स्थानों में से एक में पाया जा सकता है। \ प्रोग्राम फ़ाइलें (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64, C: \ Program फ़ाइलें (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 उपकरण
david.barkhuizen

इसे समझें, कुंजी केस-संवेदी है। -t (निचला मामला) "टोकन को कुंजी में परिवर्तित करने में विफल - अवैध असेंबली सार्वजनिक कुंजी" देगा, जो आपको गलत दिशा में खोज भेजेगा।
access_granted

31

यदि आपके पास DLL आपके प्रोजेक्ट में जोड़ा गया है, तो आप csproj फ़ाइल खोल सकते हैं और संदर्भ टैग देख सकते हैं।

उदाहरण:

<Reference Include="System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

23

sn -T <assembly>दृश्य स्टूडियो कमांड लाइन में। यदि कोई असेंबली वैश्विक असेंबली कैश में स्थापित है, तो इसे C:\Windows\assemblyGAC असेंबली की सूची में जाना और खोजना आसान है ।

अपने विशिष्ट मामले पर, आप विधानसभा संदर्भ के साथ पूर्ण नाम का मिश्रण कर सकते हैं, आप MSDN पर एक नज़र डालना चाहते हैं ।


8

उत्तर बहुत आसान है। .NET फ्रेमवर्क टूल्स का उपयोग करें sn.exe। तो Visual Studio 2008 कमांड प्रॉम्प्ट खोलें और फिर dll के फ़ोल्डर को इंगित करें जिसे आप सार्वजनिक कुंजी प्राप्त करना चाहते हैं,

निम्न आदेश का उपयोग करें,

sn -T myDLL.dll

यह आपको सार्वजनिक कुंजी टोकन देगा। एक बात याद रखें कि यह केवल तभी काम करता है जब असेंबली को जोरदार हस्ताक्षर करना हो।

उदाहरण

C: \ WINNT \ Microsoft.NET \ Framework \ v3.5> sn -T EdmGen.exe

Microsoft (R) .NET फ्रेमवर्क मजबूत नाम उपयोगिता संस्करण 3.5.21022.8
कॉपीराइट (c) Microsoft Corporation। सभी अधिकार सुरक्षित।

सार्वजनिक कुंजी टोकन b77a5c561934e089 है

यदि आपके पास Visual Studio 2013 है और आप "VS कमांड 3 के लिए डेवलपर कमांड प्रॉम्प्ट" नहीं पा सकते हैं, तो इसे ठीक करने का तरीका यहां देखें: stackoverflow.com/a/22702405/187650
juFo

ध्यान दें कि यह टूल विंडोज के साथ नहीं आता है।
इयान बॉयड

4

मैं Windows एक्सप्लोरर का उपयोग करता हूं, C: \ Windows \ असेंबली में नेविगेट करता हूं, जिसे मुझे चाहिए उसे ढूंढें। गुणों से आप PublicKeyToken को कॉपी कर सकते हैं।

यह विजुअल स्टूडियो या किसी अन्य उपयोगिताओं के स्थापित होने पर निर्भर नहीं करता है।


3

अधिक जानकारी जोड़ते हुए, मैं उल्लिखित स्थानों में sn.exe उपयोगिता को खोजने में सक्षम नहीं था, मेरे मामले में यह C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin में था


यदि आप एक दृश्य स्टूडियो कमांड प्रॉम्प्ट खोलते हैं तो यह आपके रास्ते पर होना चाहिए।
नटरास

इसे बाहर की जाँच करें: stackoverflow.com/questions/3045033/…
ThePatelGuy

2

Assembly.LoadFile (@ "C: \ Windows \ Microsoft.NET \ फ्रेमवर्क \ v4.0.30319 \ system.data.dll")। FullName

में परिणाम होगा

System.Data, संस्करण = 4.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = b77a5c561934e089


1

जैसा कि @CRice ने कहा कि आप publicKeyToken के साथ निर्भर विधानसभा की सूची प्राप्त करने के लिए नीचे दी गई विधि का उपयोग कर सकते हैं

public static int DependencyInfo(string args) 
{
    Console.WriteLine(Assembly.LoadFile(args).FullName);
    Console.WriteLine(Assembly.LoadFile(args).GetCustomAttributes(typeof(System.Runtime.Versioning.TargetFrameworkAttribute), false).SingleOrDefault());
    try {
        var assemblies = Assembly.LoadFile(args).GetReferencedAssemblies(); 

        if (assemblies.GetLength(0) > 0)
        {
            foreach (var assembly in assemblies)
            {
                Console.WriteLine(" - " + assembly.FullName + ", ProcessorArchitecture=" + assembly.ProcessorArchitecture);             
            }
            return 0;
        }
    }
    catch(Exception e) {
        Console.WriteLine("An exception occurred: {0}", e.Message);
        return 1;
    } 
    finally{}

    return 1;
}

मैं आम तौर पर इसे एक LinqPad स्क्रिप्ट के रूप में उपयोग करता हूं जिसे आप इसे कह सकते हैं

DependencyInfo("@c:\MyAssembly.dll"); कोड से


0

आप निम्न विधि से भी जांच कर सकते हैं।

रन पर जाएं: DLL का पथ टाइप करें जिसके लिए आपको सार्वजनिक कुंजी की आवश्यकता है। आपको 2 फाइलें मिलेंगी: 1. __AssemblyInfo_.ini 2. DLL फ़ाइल

नोटपैड में इस __AssemblyInfo_.ini फ़ाइल को खोलें, यहां आप सार्वजनिक कुंजी टोकन देख सकते हैं।

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