รับ PublicKeyToken ของชุดประกอบ. Net


163

วิธีที่ง่ายที่สุดในการค้นหา Public-Key-Token ของแอสเซมบลีคืออะไร

วิธีที่ง่ายที่สุดที่ฉันสามารถนึกได้ก็คือการคลิกขวาง่าย ๆ รับกุญแจสาธารณะ แต่ฟังก์ชั่นนี้ไม่ได้อยู่ที่นั่นอาจจะมี Visual Studio Extension สำหรับสิ่งนั้น?

ฉันใช้ Visual Studio 2010 หากมีส่วนขยาย


4
ดูโพสต์บล็อกนี้จาก Kirk Evans วิธีรับ PublicKeyToken ของแอสเซมบลีภายใน Visual Studio: blogs.msdn.com/b/kaevans/archive/2008/06/18/…
Martin Buberl

2
เพิ่งติดตั้ง EF6 และโดยสุจริตไม่รู้ด้วยซ้ำว่าชุดประกอบอยู่ที่ไหน อึเช่นนี้ใช้เวลาหลายชั่วโมงในวันของฉัน
froggythefrog

คำตอบ:


228

เปิดพร้อมท์คำสั่งและพิมพ์หนึ่งในบรรทัดต่อไปนี้ตามรุ่น Visual Studio และสถาปัตยกรรมระบบปฏิบัติการของคุณ:

VS 2008 บน Windows 32 บิต :

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

VS 2008 บน Windows 64 บิต:

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

VS 2010 บน Windows 32 บิต:

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

VS 2010 บน Windows 64 บิต:

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

VS 2012 บน Windows 32 บิต:

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

VS 2012 บน Windows 64 บิต:

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

VS 2015 บน Windows 64 บิต:

"%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>เป็นเส้นทางไฟล์เต็มไปชุมนุมอยู่ในความสนใจกำลังล้อมรอบด้วยคำพูดถ้ามันมีช่องว่าง

คุณสามารถเพิ่มสิ่งนี้เป็นเครื่องมือภายนอกใน VS ดังที่แสดงไว้ที่นี่:
http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token เผื่อ-a-stong ชื่อ-assembly.aspx


1
ใช่ฉันรู้ว่าฉันกำลังมองหาวิธีที่ง่ายขึ้นโดยเฉพาะอย่างยิ่งโดยไม่ต้องออก VS
moi_meme

12
แทนที่% ProgramFiles% ด้วย% ProgramFiles (x86)% หากคุณใช้เครื่อง 64 บิต
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 เครื่องมือ)
GDS

2
คำตอบที่ดีโดยละเอียด สำหรับ VS2015 ควรอยู่ภายใต้% ProgramFiles (x86)% \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX SDK Tools \ sn.exe 4.6.1
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

หากไลบรารีรวมอยู่ในโครงการ VS คุณสามารถตรวจสอบ.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" />
Simon Tewsi

ดูเหมือนว่าแอสเซมบลีทั้งหมดมีเหมือนกันPublicKeyTokenดังนั้นหนึ่งค้นหาใน.cprojดูเหมือนจะเป็นทางออกที่ง่ายที่สุด
asdf

14

หากคุณรวมแอสเซมบลีในโครงการของคุณคุณสามารถทำ:

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


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

มันไม่ได้รับโทเค็นกุญแจสาธารณะของ dll ในเอกสารอ้างอิงของฉัน วิธีการของคุณเป็นจริงได้รับ dll ทั้งหมดในการอ้างอิงของโครงการบางอย่างหรือไม่ ขอบคุณ
Francis Saul

@FrancisSaul - จะแสดงรายการชุดประกอบที่ได้รับการโหลดลงในหน่วยความจำกระบวนการของแอปพลิเคชันของคุณเท่านั้น เมื่อต้องการดูรายละเอียดของแอสเซมบลีที่เฉพาะเจาะจงก่อนเรียกใช้รหัสที่อ้างอิงถึงบางชนิดในแอสเซมบลีนั้น ตัวอย่างเช่นสร้างอินสแตนซ์ใหม่ของบางคลาสในชุดประกอบนั้น
ToolmakerSteve

นี่เป็นวิธีที่ง่ายที่สุดสำหรับฉัน สามารถทำให้ง่ายขึ้นอีก: รันแอปพลิเคชันด้วยชุดเบรกพอยต์ เมื่อดำเนินการหยุดอยู่กับเบรกพอยต์ในประเภท VS AppDomain.CurrentDomain.GetAssemblies()ทันทีหน้าต่าง: นี่จะแสดงรายการชุดประกอบที่โหลดในหน้าต่าง Immediate พร้อมรุ่นวัฒนธรรมและ PublicKeyToken สำหรับแต่ละรายการ
Simon Tewsi

นอกจากนี้ยังเป็นไปได้ที่จะทำงานใน 'C # Interactive' - ไม่จำเป็นต้องคอมไพล์!
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 วิธีใดที่คืนค่าเป็น "ไม่มี" หรือค่าที่ไม่ถูกต้อง คุณได้พิจารณาแล้วหรือว่าการชุมนุมนั้นมีชื่อเรียกว่า คุณสามารถตรวจสอบใน VS บนแผงคุณสมบัติสำหรับการอ้างอิง (ชื่อที่แข็งแกร่ง) คุณยังสามารถตรวจสอบเรื่องนี้ได้อย่างง่ายดายด้วยเครื่องถอดรหัสฟรีเช่น JustDecompile ถ้าคุณเห็นว่ามันมีชื่อที่รัดกุมดีบั๊กโค้ดและตรวจสอบไบต์
Adam Caviness

ฉันไม่สามารถรันโครงการได้หลังจากที่ฉันพิมพ์สตริงโค้ด s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web") มันบอกว่าโอเวอร์โหลดที่ดีที่สุดสำหรับเมธอดนั้นมีอาร์กิวเมนต์ที่ไม่ถูกต้อง
ฟรานซิสซาอูล

@FrancisSaul คุณกำลังส่งอาร์กิวเมนต์สตริงไปยังวิธีที่ใช้แอสเซมบลี คุณสามารถ typeof(YourPreferredTypeInThatAssembly).AssemblyหรือAssembly.GetAssembly(typeof(YourPreferredTypeInThatAssembly))ส่งผ่านวิธีนั้นได้หากคุณต้องการ
Adam Caviness

ดังนั้นไวยากรณ์จะเป็นเช่นนี้ Assembly.GetAssembly (typeof ("Stimulsoft.Report.Web.dll));
ฟรานซิสซาอูล

9

คุณสามารถเพิ่มสิ่งนี้เป็นเครื่องมือภายนอกใน Visual Studio ดังนี้:

หัวข้อ:

Get PublicKeyToken

คำสั่ง:

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

(เส้นทางอาจแตกต่างกันระหว่างเวอร์ชั่น)

อาร์กิวเมนต์:

-T "$(TargetPath)"

และตรวจสอบตัวเลือก" ใช้หน้าต่างผลลัพธ์ "


1
เมื่อคุณเลือกสิ่งนี้จากToolsเมนูมันจะทำงานโดยอัตโนมัติในโครงการใดก็ตามที่คุณเลือกในโซลูชัน Explorer
Contango

Get PublicKeyToken on Solution Explorer Selectionผมเปลี่ยนชื่อเป็นคำสั่งของฉันไป
Contango

1
คำตอบที่ดี! คำแนะนำ:หากคุณเปิดใช้งานช่องทำเครื่องหมาย "พร้อมท์สำหรับการขัดแย้ง" กล่องโต้ตอบจะเปิดขึ้นเพื่อให้คุณวางเส้นทางลงไปได้ ดังนั้นคุณสามารถคัดลอก + วางเส้นทาง assemly จากหน้าต่างคุณสมบัติที่นั่นเช่น นั่นมีประโยชน์มากสำหรับฉันโดยเฉพาะเมื่อฉันต้องเปลี่ยนการลงทะเบียนใน web.config และไม่ทราบโทเค็นคีย์สาธารณะของ DLLs
Matt

8

วิธีที่ง่ายที่สุดสำหรับฉันคือการใช้ILSpy

เมื่อคุณลากและวางชุดประกอบบนหน้าต่างและเลือกชุดประกอบที่ปล่อยทางด้านซ้ายคุณจะเห็นโทเค็นคีย์สาธารณะที่ด้านขวาของหน้าต่าง

(ผมยังคิดว่ารุ่นใหม่จะแสดงคีย์สาธารณะของลายเซ็นถ้าคุณเคยต้องให้คนอื่น ... ดูที่นี่: https://github.com/icsharpcode/ILSpy/issues/610#issuecomment-111189234สิ่งที่ดี! ;))


5

1) คำสั่งคือ C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\sn -T {your.dll}

ในตัวอย่างข้างต้น Microsoft SDK จะอยู่ใน SDKs \ Windows \ v6.0A Files \ Microsoft C: \ Program สภาพแวดล้อมของคุณอาจแตกต่างกัน

2) เพื่อรับโทเค็นคีย์สาธารณะของโครงการของคุณคุณสามารถเพิ่ม sn.exe เป็นส่วนหนึ่งของเครื่องมือภายนอกของคุณใน Visual Studio ขั้นตอนที่แสดงอยู่ในการเชื่อมโยงของ Microsoft นี้: วิธีการ: สร้างเครื่องมือที่ได้รับคีย์สาธารณะของสมัชชา


ใช่ฉันรู้ว่าฉันกำลังมองหาวิธีที่ง่ายกว่าโดยไม่ต้องออกจาก VS
moi_meme

5

ในกรณีที่มีใครบางคนกำลังมองหาPublic Key (อย่างฉัน) ไม่ใช่Public Key Token - การใช้ sn.exe ทำงานได้ดีมากยกเว้นคุณต้องใช้-Tpสวิตช์ซึ่งจะคืนค่าทั้ง Public Key และ Public Key Token - เพิ่มเติม ที่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

วิธีการอื่นจะเป็นถ้าคุณมี decompiler เพียงแค่ค้นหาในนั้นพวกเขามักจะให้กุญแจสาธารณะ ฉันดูที่. Net Reflector, Telerik Just Decompile และ ILSpy เพียงถอดรหัสพวกเขาดูเหมือนจะมีโทเค็นกุญแจสาธารณะปรากฏขึ้น


1

ตัวเลือกอื่นคือการใช้เครื่องมือโอเพ่นซอร์ส NuGet Package Explorerสำหรับสิ่งนี้

จากแพ็คเกจ Nuget (.nupkg) คุณสามารถตรวจสอบ PublicKeyToken หรือลากไบนารี (.dll) ในเครื่องมือ สำหรับอันหลังเลือกแรก "ไฟล์ -> ใหม่"

ป้อนคำอธิบายรูปภาพที่นี่


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