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?


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

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 .


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

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 .


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

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.



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


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


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.

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.