ฉันจะค้นหา PublicKeyToken สำหรับ dll เฉพาะได้อย่างไร


198

ฉันต้องสร้างผู้ให้บริการใหม่ในไฟล์ 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 เพื่อประกอบได้อย่างไร

อีกทางหนึ่งฉันจะผิดทางอย่างสิ้นเชิงกับเรื่องนี้?


สำเนาที่เป็นไปได้ของการรับ PublicKeyToken ของชุดประกอบ. Net
Michael Freidgeim

คำตอบ:


284

ใช้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
มันสมบูรณ์แบบ! หลีกเลี่ยงการติดตั้งเครื่องมือพิเศษ
nirav

1
ที่ดี! สามารถใช้งานได้เช่นกันเมื่อไม่มี PublicKeyToken (เช่นชุดประกอบที่ไม่ได้ลงชื่อ)
MovGP0

2
ใน C # Interactive คุณสามารถโทร: Console.WriteLine (System.Reflection.Assembly.LoadFile (@ "c: \ some.dll"). FullName);
Auri Rahimzadeh

2
น่ารำคาญ PowerShell.exe เก็บล็อคใน dll แม้หลังจากการโทรเสร็จสมบูรณ์ ฉันต้องปิดคอนโซล PowerShell ก่อนที่ฉันจะสามารถสร้างโซลูชันได้อีกครั้ง
Cee McSharpface

141

ใช้ยูทิลิตีsn.exe :

sn -T YourAssembly.dll

หรือโหลดการชุมนุมในกระจกสะท้อนแสง


31
โดยทั่วไปสามารถพบ sn.exe ได้ที่หนึ่งในตำแหน่งต่อไปนี้ภายใต้ SDKs \ Windows Files: x86 (x86) \ Microsoft: C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin, C: \ Program SDK \ \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64, C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX SDK 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>ในบรรทัดคำสั่ง Visual Studio หากติดตั้งแอสเซมบลีในแคชแอสเซมบลีส่วนกลางมันง่ายกว่าที่จะไปC:\Windows\assemblyและค้นหาในรายการของแอสเซมบลี GAC

เกี่ยวกับกรณีที่เฉพาะเจาะจงของคุณคุณอาจจะมีการผสมชนิดระบุชื่อเต็มไปด้วยการอ้างอิงประกอบคุณอาจต้องการที่จะดูที่MSDN


8

sn.exeคำตอบคือการใช้งานที่ง่ายมากเครื่องมือ .NET Framework ดังนั้นให้เปิดพรอมต์คำสั่ง Visual Studio 2008 แล้วชี้ไปที่โฟลเดอร์ของ dll ที่คุณต้องการรับกุญแจสาธารณะ

ใช้คำสั่งดังต่อไปนี้

sn –T myDLL.dll

นี่จะให้โทเค็นกุญแจสาธารณะแก่คุณ โปรดจำไว้ว่าสิ่งนี้ใช้ได้ผลก็ต่อเมื่อการชุมนุมจะต้องมีการลงนามอย่างมาก

ตัวอย่าง

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

Microsoft (R) .NET Framework Strong ชื่อยูทิลิตี้รุ่น 3.5.21022.8
ลิขสิทธิ์ (c) Microsoft Corporation สงวนลิขสิทธิ์.

โทเค็นกุญแจสาธารณะคือ b77a5c561934e089

หากคุณมี Visual Studio 2013 และคุณไม่สามารถหา "Command Command Prompt for VS2013" ลองดูที่นี่วิธีแก้ไข: stackoverflow.com/a/22702405/187650
juFo

โปรดทราบว่าเครื่องมือนี้ไม่ได้มาพร้อมกับ Windows
Ian Boyd

4

ฉันใช้ Windows Explorer ไปที่ C: \ Windows \ assembly ค้นหาสิ่งที่ฉันต้องการ จากคุณสมบัติคุณสามารถคัดลอก PublicKeyToken

สิ่งนี้ไม่ต้องอาศัย Visual Studio หรือยูทิลิตี้อื่น ๆ ที่กำลังติดตั้ง


3

เพิ่งเพิ่มข้อมูลเพิ่มเติมฉันไม่สามารถค้นหายูทิลิตี sn.exe ในตำแหน่งที่ตั้งที่กล่าวถึงในกรณีของฉันมันอยู่ใน C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin


หากคุณเปิดพรอมต์คำสั่ง visual studio ควรอยู่ในเส้นทางของคุณ
Nattrass


2

Assembly.LoadFile (@ "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ system.data.dll"). FullName

จะส่งผลให้

ระบบข้อมูล, รุ่น = 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

คุณสามารถตรวจสอบโดยใช้วิธีการดังต่อไปนี้

ไปที่ Run: พิมพ์พา ธ ของ DLL ที่คุณต้องการพับลิกคีย์ คุณจะพบไฟล์ 2 ไฟล์: 1. __AssemblyInfo_.ini 2. ไฟล์ DLL

เปิดไฟล์ __AssemblyInfo_.ini นี้ใน notepad ที่นี่คุณสามารถเห็นโทเค็นคีย์สาธารณะ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.