Mendapatkan PublicKeyToken dari .Net rakitan


163

Apa cara paling sederhana untuk menemukan Public-Key-Token dari sebuah majelis?

Cara paling sederhana yang dapat saya pikirkan adalah klik kanan sederhana, dapatkan kunci publik, tetapi fungsi ini tidak ada, mungkin ada Visual Studio Extension untuk itu?

Saya menggunakan Visual Studio 2010, jika ekstensi tersedia.


4
Lihat posting blog ini dari Kirk Evans cara mendapatkan PublicKeyToken dari sebuah majelis dalam Visual Studio: blogs.msdn.com/b/kaevans/archive/2008/06/18/…
Martin Buberl

2
Baru saja menginstal EF6 dan jujur ​​bahkan tidak tahu di mana majelis berada. Omong kosong seperti ini butuh berjam-jam dalam sehari.
froggythefrog

Jawaban:


228

Buka prompt perintah dan ketik salah satu baris berikut sesuai dengan versi Visual Studio dan Arsitektur Sistem Operasi Anda:

VS 2008 pada Windows 32bit :

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

VS 2008 pada Windows 64bit:

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

VS 2010 pada Windows 32bit:

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

VS 2010 pada Windows 64bit:

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

VS 2012 pada Windows 32bit:

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

VS 2012 pada Windows 64bit:

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

VS 2015 pada Windows 64bit:

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

Perhatikan bahwa untuk versi VS2012 +, aplikasi sn.exe tidak lagi di dalam bin, tetapi di dalam sub-folder. Juga, perhatikan bahwa untuk 64bit Anda perlu menentukan (x86) folder.

Jika Anda lebih suka menggunakan prompt perintah Visual Studio, cukup ketik:

sn -T <assembly> 

di mana <assemblyname>path file lengkap ke majelis yang Anda minati, dikelilingi oleh tanda kutip jika memiliki spasi.

Anda dapat menambahkan ini sebagai alat eksternal dalam VS, seperti yang ditunjukkan di sini:
http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token -untuk-stong-bernama-assembly.aspx


1
Ya saya tahu itu, saya mencari cara yang lebih mudah, lebih baik tanpa meninggalkan VS
moi_meme

12
Ganti% ProgramFiles% dengan% ProgramFiles (x86)% jika Anda menggunakan mesin 64-bit.
System.Cats.Lol

1
Untuk VS2012 itu di bawah "%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>. Catatan sn terselip di satu tingkat folder tambahan setelah nampan (di NETFX 4.0 Tools).
GDS

2
Jawaban yang bagus dan rumit. Untuk VS2015 harus di bawah% ProgramFiles (x86)% \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Alat \ sn.exe
ThePatelGuy

1
Jalur VS2015 haruslah v10.0A, bukan V1.0A
Michael Itzoe

87

pilihan lain:

jika Anda menggunakan PowerShell, Anda bisa mengetahuinya seperti:

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

Suka

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

dan akan muncul seperti

MySql.Data, Versi = 6.6.5.0, Culture = netral, PublicKeyToken = c5687fc88969c44d


Luar biasa, izinkan saya menyalin dan menempelkan seluruh hasil langsung ke konfigurasi web jika saya menambahkan rakitan secara manual. Terima kasih!
GJKH

Jawaban yang bagus, karena Anda juga bisa mendapatkan versinya (yang penting untuk pemecahan masalah).
sbkrogers

48

Jika perpustakaan termasuk dalam proyek VS, Anda dapat memeriksa .cprojfile, misalnya:

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

2
Saya hanya melihat <Referensi Sertakan = "System.IdentityModel" /> (sama untuk asseblies lain)
FrenkyB

Tampaknya tidak banyak digunakan untuk majelis di pustaka sistem .NET. misalnya untuk System.Configuration hanya mengatakan<Reference Include="System.Configuration" />
Simon Tewsi

Sepertinya semua majelis memiliki hal yang sama PublicKeyToken, jadi orang mencari .cprojsolusi yang paling mudah.
asdf

14

Jika Anda sudah memasukkan perakitan dalam proyek Anda, Anda dapat melakukan:

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


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

itu tidak mendapatkan token kunci publik dll di Referensi saya. Apakah metode Anda benar-benar mendapatkan semua dll dalam referensi proyek tertentu? terima kasih
Francis Saul

@FrancisSaul - hanya akan mendaftar majelis yang telah dimuat ke dalam memori proses aplikasi Anda; untuk melihat detail perakitan tertentu, jalankan dulu kode yang merujuk pada beberapa jenis dalam perakitan itu. Misalnya, buat instance baru dari beberapa kelas dalam perakitan itu.
ToolmakerSteve

Ini adalah metode paling sederhana yang berhasil untuk saya. Ini dapat disederhanakan lebih lanjut: Jalankan aplikasi dengan set breakpoint. Ketika eksekusi berhenti pada breakpoint, dalam jenis VS Segera Window: AppDomain.CurrentDomain.GetAssemblies(). Ini akan mencantumkan majelis yang dimuat di Jendela Segera, dengan Versi, Budaya, dan PublicKeyToken untuk masing-masingnya.
Simon Tewsi

Juga dimungkinkan untuk dijalankan di 'C # Interactive' - tidak diperlukan kompilasi!
bTab

13

Anda bisa mendapatkan ini dengan mudah melalui 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;
}

Saya mencoba kode Anda tetapi tidak berfungsi. Saya ingin mendapatkan token kunci publik Stimulsoft.Report.Web.dll yang sudah ada di Referensi saya. Saya menyalin kode Anda dan tidak menyebutkan nama dll tetapi tidak berfungsi. Kode saya kira-kira begini: string s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web"). Jelas metode ini menerima rakitan, bukan nama string. Bisakah Anda membantu saya cara menggunakan metode Anda?
Francis Saul

@FrancisSaul Apa metode mengembalikan, "Tidak ada" atau nilai yang salah? Sudahkah Anda menentukan bahwa majelis itu memang bernama kuat? Anda dapat memverifikasi dalam VS pada panel properti untuk referensi (Nama Kuat). Anda juga dapat dengan mudah memeriksa ini dengan sebagian besar dekompiler gratis seperti JustDecompile. Jika Anda melihatnya kuat bernama, debug kode dan periksa byte.
Adam Caviness

Saya tidak dapat menjalankan proyek, setelah saya mengetikkan kode string s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web"), ia mengatakan kelebihan beban terbaik untuk metode memiliki argumen yang tidak valid.
Francis Saul

@FrancisSaul Anda memberikan argumen string ke metode yang membutuhkan Majelis. Anda dapat typeof(YourPreferredTypeInThatAssembly).Assemblyatau Assembly.GetAssembly(typeof(YourPreferredTypeInThatAssembly))dan meneruskannya ke metode jika Anda mau.
Adam Caviness

Jadi sintaksinya akan seperti ini. Assembly.GetAssembly (typeof ("Stimulsoft.Report.Web.dll));
Francis Saul

9

Anda dapat menambahkan ini sebagai alat eksternal ke Visual Studio seperti:

Judul:

Get PublicKeyToken

Perintah:

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

(Path mungkin berbeda di antara versi)

Argumen:

-T "$(TargetPath)"

Dan periksa " Use Output window ".


1
Ketika Anda memilih ini dari Toolsmenu, itu akan secara otomatis beroperasi pada Proyek apa pun yang Anda pilih di Solution Explorer.
Contango

Saya mengganti nama perintah saya menjadi Get PublicKeyToken on Solution Explorer Selection.
Contango

1
Jawaban yang bagus! Petunjuk: Jika Anda mengaktifkan kotak centang "Prompt for arguments", maka dialog akan terbuka yang memungkinkan Anda untuk menempelkan lintasan ke dalamnya. Jadi Anda bisa menyalin + tempelkan jalur yang benar-benar dari jendela properti di sana misalnya. Itu sangat berguna bagi saya, terutama ketika saya harus mengubah pendaftaran di web.config dan tidak tahu token kunci publik DLL.
Matt


5

1) Perintahnya adalah C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\sn -T {your.dll}

Dalam contoh di atas, Microsoft SDK berada di C: \ Program Files \ Microsoft SDKs Windows \ v6.0A. Lingkungan Anda mungkin berbeda.

2) Untuk mendapatkan token kunci publik dari salah satu proyek Anda, Anda dapat menambahkan sn.exe sebagai bagian dari Alat Eksternal di Visual Studio. Langkah-langkahnya ditunjukkan dalam tautan Microsoft ini: Cara: Membuat Alat untuk Mendapatkan Kunci Publik dari Majelis


Ya saya tahu itu, saya mencari cara yang lebih mudah, lebih baik tanpa meninggalkan VS
moi_meme


5

Sebagai alternatif, Anda juga dapat menggunakan linqseperti ini -

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

1
Dia meminta token kunci publik. Kode Anda menggunakan kunci publik. Seharusnya.GetPublicKeyToken()
Stefan Lahir

1

Metode alternatif adalah jika Anda memiliki dekompiler, lihat saja di sana, mereka biasanya menyediakan kunci publik. Saya telah melihat .Net Reflector, Telerik Just Decompile dan ILSpy hanya mendekompilasi mereka tampaknya memiliki token kunci publik ditampilkan.


1

Opsi lain adalah menggunakan alat open source, NuGet Package Explorer untuk ini.

Dari paket Nuget (.nupkg) Anda bisa memeriksa PublicKeyToken, atau menyeret biner (.dll) di dalam alat. Untuk yang terakhir pilih pertama "File -> baru"

masukkan deskripsi gambar di sini


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.