Bagaimana cara menemukan PublicKeyToken untuk dll tertentu?

197

Saya perlu membuat ulang penyedia di file web.config saya yang terlihat seperti ini:

<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>

Namun, saya mendapatkan kesalahan runtime mengatakan majelis ini tidak dapat dimuat, dan saya pikir itu karena saya salah PublicKeyToken. Bagaimana cara mencari PublicKeyToken untuk perakitan saya?

Atau, apakah saya salah sepenuhnya dengan ini?

Matthew Jones
sumber
Kemungkinan duplikat Mendapatkan PublicKeyToken dari .Net assemblies
Michael Freidgeim

Jawaban:

282

Menggunakan PowerShell , Anda dapat menjalankan pernyataan ini:

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

Output akan memberikan Versi , Budaya dan PublicKeyToken seperti yang ditunjukkan di bawah ini:

MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a
danielB
sumber
1
Terima kasih! metode Anda adalah satu-satunya yang bekerja untuk saya sn -T dllname.dll hanya akan menampilkan teks bantuan ketika saya menjalankannya
Vdex
1
Itu sempurna! Hindari memasang alat tambahan.
nirav
1
Bagus! ini berfungsi juga ketika tidak ada PublicKeyToken yang tersedia (mis., kumpulan yang tidak ditandatangani)
MovGP0
2
Di C # Interactive, Anda dapat menghubungi: Console.WriteLine (System.Reflection.Assembly.LoadFile (@ "c: \ some.dll"). FullName);
Auri Rahimzadeh
2
Mengganggu, PowerShell.exe menyimpan kunci di dll bahkan setelah panggilan selesai. Saya perlu menutup konsol PowerShell sebelum saya bisa membangun solusi saya lagi.
Cee McSharpface
141

Menggunakan utilitas sn.exe :

sn -T YourAssembly.dll

atau memuat rakitan di Reflektor .

Darin Dimitrov
sumber
31
sn.exe biasanya dapat ditemukan di salah satu lokasi berikut di bawah C: \ Program Files (x86) \ Microsoft SDKs \ Windows: C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin, C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64, C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools
david.barkhuizen
Pikiran itu, kuncinya adalah case-sensitive. -t (huruf kecil) akan memberikan "Gagal mengonversi kunci menjadi token - Kunci publik perakitan tidak valid.", yang akan mengirim Anda mencari ke arah yang salah.
access_granted
31

Jika Anda memiliki DLL yang ditambahkan ke proyek Anda, Anda dapat membuka file csproj dan melihat tag Referensi.

Contoh:

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

sn -T <assembly>di baris perintah Visual Studio. Jika rakitan dipasang di cache rakitan global, lebih mudah untuk pergi C:\Windows\assemblydan menemukannya di daftar rakitan GAC.

Pada kasus khusus Anda, Anda mungkin mencampur nama lengkap tipe dengan referensi perakitan, Anda mungkin ingin melihat MSDN .

Joaquim Rendeiro
sumber
8

Jawabannya sangat sederhana menggunakan alat .NET Framework sn.exe. Jadi buka Visual Studio 2008 Command Prompt dan kemudian arahkan ke folder dll Anda ingin mendapatkan kunci publik,

Gunakan perintah berikut,

sn –T myDLL.dll

Ini akan memberi Anda token kunci publik. Ingat satu hal ini hanya berfungsi jika majelis harus ditandatangani dengan kuat.

Contoh

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

Microsoft (R) .NET Framework Strong Name Utility Version 3.5.21022.8
Hak Cipta (c) Microsoft Corporation. Seluruh hak cipta.

Token kunci publik adalah b77a5c561934e089
Prasanna Balajee
sumber
Jika Anda memiliki Visual Studio 2013 dan Anda tidak dapat menemukan "Prompt Perintah Pengembang untuk VS2013" lihat di sini cara memperbaikinya: stackoverflow.com/a/22702405/187650
juFo
Perhatikan bahwa alat ini tidak datang dengan Windows.
Ian Boyd
4

Saya menggunakan Windows Explorer, arahkan ke C: \ Windows \ assembly, temukan yang saya butuhkan. Dari Properties Anda dapat menyalin PublicKeyToken.

Ini tidak bergantung pada Visual Studio atau utilitas lain yang diinstal.

Mike Honey
sumber
3

Hanya menambahkan lebih banyak info, saya tidak dapat menemukan utilitas sn.exe di lokasi yang disebutkan, dalam kasus saya itu di C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin

Hiram
sumber
Jika Anda membuka command prompt visual studio itu harus di jalan Anda.
Nattrass
2

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

Akan menghasilkan

System.Data, Versi = 4.0.0.0, Budaya = netral, PublicKeyToken = b77a5c561934e089

CRice
sumber
1

Seperti yang dikatakan @CRice, Anda dapat menggunakan metode di bawah ini untuk mendapatkan daftar unit dependen dengan 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;
}

saya biasanya menggunakannya sebagai skrip LinqPad Anda dapat menyebutnya sebagai

DependencyInfo("@c:\MyAssembly.dll"); dari kode

Vinod Srivastav
sumber
0

Anda juga dapat memeriksa dengan metode berikut.

Pergi ke Jalankan: ketik lintasan DLL yang Anda perlukan kunci publik. Anda akan menemukan 2 file: 1. __AssemblyInfo_.ini 2. File DLL

Buka file __AssemblyInfo_.ini ini di notepad, di sini Anda dapat melihat Token Kunci Publik.

Mohit Verma
sumber