Làm cách nào để tìm PublicKeyToken cho một dll cụ thể?


197

Tôi cần tạo lại một nhà cung cấp trong tệp web.config của mình trông giống như thế này:

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

Tuy nhiên, tôi gặp lỗi thời gian chạy nói rằng tập hợp này không thể tải được và tôi nghĩ đó là do tôi có lỗi PublicKeyToken. Làm cách nào để tra cứu PublicKeyToken cho hội đồng của tôi?

Ngoài ra, tôi đang đi sai hoàn toàn với điều này?


Câu trả lời:


282

Sử dụng PowerShell , bạn có thể thực thi câu lệnh này:

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

Đầu ra sẽ cung cấp Phiên bản , Văn hóaPublicKeyToken như dưới đây:

MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a

1
Cảm ơn! phương pháp của bạn là phương pháp duy nhất phù hợp với tôi sn -Tllll.dll sẽ chỉ hiển thị văn bản trợ giúp khi tôi chạy nó
Vdex

1
Thật hoàn hảo! Tránh cài đặt các công cụ bổ sung.
nirav 4/2/2015

1
tuyệt quá! điều này cũng hoạt động khi không có sẵn PublicKeyToken (nghĩa là các hội đồng chưa được ký)
MovGP0

2
Trong C # Interactive, bạn có thể gọi: Console.WriteLine (System.Reflection.Ass lanh.LoadFile (@ "c: \ some.dll"). FullName);
Auri Rahimzadeh

2
Khó chịu, PowerShell.exe giữ một khóa trên dll ngay cả sau khi cuộc gọi hoàn thành. Tôi cần đóng bảng điều khiển PowerShell trước khi có thể xây dựng lại giải pháp của mình.
Cee McSharpface

141

Sử dụng tiện ích sn.exe :

sn -T YourAssembly.dll

hoặc tải lắp ráp trong Reflector .


31
Thông thường sn.exe có thể được tìm thấy tại một trong các vị trí sau trong C: \ Program Files (x86) \ Microsoft SDKs \ Windows: C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin, C: \ Tệp chương trình (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64, C: \ Chương trình tệp (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Công cụ
david.barkhuizen

Hãy nhớ rằng, chìa khóa là trường hợp nhạy cảm. -t (chữ thường) sẽ đưa ra "Không thể chuyển đổi khóa thành mã thông báo - Khóa công khai lắp ráp không hợp lệ.", sẽ khiến bạn tìm kiếm sai hướng.
access_granted

31

Nếu bạn đã thêm DLL vào dự án của mình, bạn có thể mở tệp csproj và xem thẻ Tham chiếu.

Thí dụ:

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

23

sn -T <assembly>trong dòng lệnh Visual Studio. Nếu một hội đồng được cài đặt trong bộ đệm lắp ráp toàn cầu, việc C:\Windows\assemblytìm và tìm thấy nó trong danh sách các hội đồng GAC sẽ dễ dàng hơn .

Trong trường hợp cụ thể của bạn, bạn có thể trộn lẫn tên đầy đủ với tham chiếu lắp ráp, bạn có thể muốn xem MSDN .


8

Trả lời là rất đơn giản sử dụng các công cụ .NET Framework sn.exe. Vì vậy, hãy mở Visual Studio 2008 Command Prompt và sau đó trỏ đến thư mục của dll mà bạn muốn lấy khóa chung,

Sử dụng lệnh sau đây,

snTHERT myDLL.dll

Điều này sẽ cung cấp cho bạn mã thông báo khóa công khai. Hãy nhớ một điều điều này chỉ hoạt động nếu lắp ráp phải được ký mạnh mẽ.

Thí dụ

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

Microsoft (R) .NET Framework Tiện ích tên mạnh Phiên bản 3.5.21022.8
Bản quyền (c) Tập đoàn Microsoft. Đã đăng ký Bản quyền.

Mã thông báo khóa công khai là b77a5c561934e089

Nếu bạn có Visual Studio 2013 và bạn không thể tìm thấy "Dấu nhắc lệnh dành cho nhà phát triển cho VS2013", hãy xem tại đây cách khắc phục: stackoverflow.com/a/22702405/187650
juFo 30/03/2015

Lưu ý rằng công cụ này không đi kèm với Windows.
Ian Boyd

4

Tôi sử dụng Windows Explorer, điều hướng đến C: \ Windows \ assembly, tìm cái tôi cần. Từ Thuộc tính, bạn có thể sao chép PublicKeyToken.

Điều này không phụ thuộc vào Visual Studio hoặc bất kỳ tiện ích nào khác đang được cài đặt.


3

Chỉ cần thêm thông tin, tôi không thể tìm thấy tiện ích sn.exe ở các vị trí được đề cập, trong trường hợp của tôi là trong C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin


Nếu bạn mở một dấu nhắc lệnh của studio trực quan thì nó sẽ nằm trên đường dẫn của bạn.
Nattrass


2

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

Sẽ cho kết quả

System.Data, Phiên bản = 4.0.0.0, Văn hóa = trung tính, PublicKeyToken = b77a5c561934e089


1

Như @CRice cho biết bạn có thể sử dụng phương thức dưới đây để có được danh sách lắp ráp phụ thuộc với 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;
}

tôi thường sử dụng nó như một LinqPad kịch bản mà bạn có thể gọi nó là

DependencyInfo("@c:\MyAssembly.dll"); từ mã


0

Bạn cũng có thể kiểm tra theo phương pháp sau.

Đi đến Run: nhập đường dẫn của DLL mà bạn cần khóa công khai. Bạn sẽ tìm thấy 2 tệp: 1. __AssuggingInfo_.ini 2. Tệp DLL

Mở tệp __AssuggingInfo_.ini này trong notepad, tại đây bạn có thể thấy Mã thông báo khóa công khai.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.