Lấy PublicKeyToken của các hội đồng .Net


163

Cách đơn giản nhất để tìm mã thông báo khóa công khai của một hội đồng là gì?

Cách đơn giản nhất tôi có thể nghĩ đến là nhấp chuột phải đơn giản, lấy khóa công khai, nhưng chức năng này không có ở đó, có thể có Visual Studio Extension cho điều đó?

Tôi đang sử dụng Visual Studio 2010, nếu có tiện ích mở rộng.


4
Xem bài đăng trên blog này từ Kirk Evans cách nhận PublicKeyToken của một hội đồng trong Visual Studio: blog.msdn.com/b/kaevans/archive/2008/06/18/ (
Bub Buberl

2
Chỉ cần cài đặt EF6 và thành thật thậm chí không biết vị trí lắp ráp. Crap như thế này mất hàng giờ trong ngày của tôi.
froggythefrog

Câu trả lời:


228

Mở một dấu nhắc lệnh và nhập một trong các dòng sau theo phiên bản Visual Studio và Kiến trúc hệ điều hành:

VS 2008 trên Windows 32 bit :

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

VS 2008 trên Windows 64 bit:

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

VS 2010 trên Windows 32 bit:

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

VS 2010 trên Windows 64 bit:

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

VS 2012 trên Windows 32 bit:

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

VS 2012 trên Windows 64 bit:

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

VS 2015 trên Windows 64 bit:

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

Lưu ý rằng đối với các phiên bản VS2012 +, ứng dụng sn.exe không còn trong bin mà trong thư mục con. Ngoài ra, lưu ý rằng đối với 64 bit, bạn cần chỉ định thư mục (x86).

Nếu bạn thích sử dụng dấu nhắc lệnh của Visual Studio, chỉ cần gõ:

sn -T <assembly> 

nơi <assemblyname>có đường dẫn tệp đầy đủ đến hội đồng mà bạn quan tâm, được bao quanh bởi dấu ngoặc kép nếu nó có khoảng trắng.

Bạn có thể thêm công cụ này dưới dạng một công cụ bên ngoài trong VS, như được hiển thị ở đây:
http://bloss.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token -for-a-stong-name-assembly.aspx


1
Vâng tôi biết điều đó, tôi đang tìm kiếm một cách dễ dàng hơn, tốt nhất là không rời khỏi VS
moi_meme

12
Thay thế% ProgramFiles% bằng% ProgramFiles (x86)% nếu bạn đang sử dụng máy 64 bit.
System.Cats.Lol

1
Đối với VS2012, nó nằm dưới "%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>. Lưu ý sn được giấu trong một cấp thư mục bổ sung sau bin (trong Công cụ NETFX 4.0).
GDS

2
Đẹp trả lời công phu. Đối với VS2015, nó phải nằm dưới% ProgramFiles (x86)% \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Công cụ \ sn.exe
ThePatelGuy

1
Đường dẫn VS2015 phải là v10.0A, không phải là V1.0A
Michael Itzoe

87

tùy chọn khác:

nếu bạn sử dụng PowerShell, bạn có thể tìm hiểu như:

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

giống

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

và sẽ xuất hiện như

MySql.Data, Phiên bản = 6.6.5.0, Văn hóa = trung tính, PublicKeyToken = c5687fc88969c44d


Tuyệt vời, cho phép tôi sao chép và dán toàn bộ kết quả vào cấu hình web nếu tôi thêm thủ công. Cảm ơn!
GJKH

Câu trả lời tuyệt vời, vì bạn cũng có thể nhận được phiên bản (điều này có thể quan trọng để khắc phục sự cố).
sbkrogers

48

Nếu thư viện được bao gồm trong dự án VS, bạn có thể kiểm tra .cprojtệp, ví dụ:

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

2
Tôi chỉ thấy <Reference Bao gồm = "System.IdentityModel" /> (tương tự cho các asseblies khác)
FrenkyB

Dường như không được sử dụng nhiều cho các hội đồng trong các thư viện hệ thống .NET. ví dụ: đối với System.Configuration nó chỉ nói<Reference Include="System.Configuration" />
Simon Tewsi

Có vẻ như tất cả các hội đồng đều giống nhau PublicKeyToken, vì vậy một người tìm kiếm trong .cprojdường như là giải pháp dễ nhất.
asdf

14

Nếu bạn đã bao gồm lắp ráp trong dự án của bạn, bạn có thể làm:

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


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

nó không nhận được mã thông báo khóa công khai của dll trong Tài liệu tham khảo của tôi. Là phương pháp của bạn thực sự có được tất cả các dll trong tài liệu tham khảo của một dự án nhất định? cảm ơn
Francis Saul

@FrancisSaul - nó sẽ chỉ liệt kê các hội đồng đã được LOADED vào bộ nhớ tiến trình của ứng dụng của bạn; để xem chi tiết cho một hội đồng cụ thể, trước tiên hãy chạy mã tham chiếu đến một số loại trong hội đồng đó. Ví dụ, tạo một thể hiện mới của một số lớp trong hội đồng đó.
ToolmakerSteve

Đây là phương pháp đơn giản nhất làm việc cho tôi. Nó có thể được đơn giản hóa hơn nữa: Chạy ứng dụng với một bộ điểm dừng. Khi việc thực thi tạm dừng trên điểm dừng, trong loại Cửa sổ ngay lập tức VS : AppDomain.CurrentDomain.GetAssemblies(). Điều này sẽ liệt kê các hội đồng được tải trong Cửa sổ ngay lập tức, với Phiên bản, Văn hóa và PublicKeyToken cho mỗi hội đồng.
Simon Tewsi

Cũng có thể chạy trong 'C # Interactive' - không cần biên dịch!
bTab

13

Bạn có thể nhận được điều này dễ dàng thông qua 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;
}

Tôi đã thử mã của bạn nhưng nó không hoạt động. Tôi muốn nhận mã thông báo khóa công khai của Stimulsoft.Report.Web.dll đã có trong Tài liệu tham khảo của tôi. Tôi đã sao chép mã của bạn và đã vượt qua tên của dll nhưng nó không hoạt động. Mã của tôi đi như thế này: chuỗi s = GetPublicKeyTokenFromAssugging ("Stimulsoft.Report.Web"). Rõ ràng phương thức này là chấp nhận lắp ráp, không phải là một tên chuỗi. Bạn có thể giúp tôi làm thế nào để sử dụng phương pháp của bạn?
Francis Saul

@FrancisSaul Phương thức nào trả về, "Không" hoặc giá trị không chính xác? Bạn đã xác định rằng lắp ráp thực sự có tên mạnh mẽ? Bạn có thể xác minh trong VS trên bảng thuộc tính để tham khảo (Tên mạnh). Bạn cũng có thể dễ dàng kiểm tra điều này với hầu hết các trình dịch ngược miễn phí như JustDecompile. Nếu bạn thấy nó có tên mạnh, hãy gỡ lỗi mã và kiểm tra các byte.
Adam Caviness

Tôi không thể chạy dự án, sau khi tôi nhập chuỗi mã s = GetPublicKeyTokenFromAssugging ("Stimulsoft.Report.Web"), nó nói rằng quá tải tốt nhất cho phương thức có các đối số không hợp lệ.
Francis Saul

@FrancisSaul Bạn đang truyền một đối số chuỗi cho một phương thức có một hội. Bạn có thể typeof(YourPreferredTypeInThatAssembly).Assemblyhoặc Assembly.GetAssembly(typeof(YourPreferredTypeInThatAssembly))và truyền nó cho phương thức nếu bạn muốn.
Adam Caviness

Vì vậy, cú pháp sẽ như thế này. Hội đồng.GetAssugging (typeof ("Stimulsoft.Report.Web.dll));
Francis Saul

9

Bạn có thể thêm nó như một công cụ bên ngoài vào Visual Studio như vậy:

Tiêu đề:

Get PublicKeyToken

Chỉ huy:

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

(Đường dẫn có thể khác nhau giữa các phiên bản)

Tranh luận:

-T "$(TargetPath)"

Và kiểm tra tùy chọn " Sử dụng cửa sổ đầu ra ".


1
Khi bạn chọn mục này từ Toolsmenu, nó sẽ tự động hoạt động trên bất kỳ Dự án nào bạn đã chọn trong Solution Explorer.
Contango

Tôi đổi tên lệnh của tôi thành Get PublicKeyToken on Solution Explorer Selection.
Contango

1
Câu trả lời tốt! Gợi ý: Nếu bạn bật hộp kiểm "Nhắc đối số", thì hộp thoại sẽ mở ra cho phép bạn dán đường dẫn vào đó. Vì vậy, bạn có thể sao chép + dán đường dẫn lắp ráp từ cửa sổ thuộc tính ở đó. Điều đó rất hữu ích đối với tôi, đặc biệt là khi tôi phải thay đổi đăng ký trong web.config và không biết mã thông báo khóa công khai DLL.
Matt

8

Cách đơn giản nhất đối với tôi là sử dụng ILSpy .

Khi bạn kéo và thả cụm trên cửa sổ của nó và chọn cụm bị rơi ở bên trái, bạn có thể thấy mã thông báo khóa chung ở bên phải của cửa sổ.

(Tôi cũng nghĩ rằng các phiên bản mới hơn cũng sẽ hiển thị khóa chung của chữ ký, nếu bạn cần số đó ... Xem tại đây: https://github.com/icsharpcode/ILSpy/issues/610#issuecomment-111189234 . Đồ tốt! ;))


5

1) Lệnh là C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\sn -T {your.dll}

Trong ví dụ trên, Microsoft SDK nằm trong C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A. Môi trường của bạn có thể khác nhau.

2) Để nhận mã thông báo khóa chung của bất kỳ dự án nào của bạn, bạn có thể thêm sn.exe như một phần của Công cụ bên ngoài trong Visual Studio. Các bước được hiển thị trong liên kết Microsoft này: Cách: Tạo một công cụ để lấy khóa chung của một hội


Vâng tôi biết điều đó, tôi đang tìm kiếm một cách dễ dàng hơn, tốt nhất là không rời khỏi VS
moi_meme


5

Thay thế, bạn cũng có thể sử dụng linqnhư thế này -

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

1
Ông yêu cầu mã thông báo khóa công khai. Mã của bạn sử dụng khóa chung. Nó nên là.GetPublicKeyToken()
Stefan Sinh

1

Một phương pháp thay thế sẽ là nếu bạn có trình dịch ngược, chỉ cần tìm nó trong đó, chúng thường cung cấp khóa chung. Tôi đã xem xét .Net Reflector, Telerik Just Decompile và ILSpy chỉ dịch ngược chúng dường như có mã thông báo khóa công khai được hiển thị.


1

Một tùy chọn khác là sử dụng công cụ mã nguồn mở NuGet Gói Explorer cho việc này.

Từ gói Nuget (.nupkg), bạn có thể kiểm tra PublicKeyToken hoặc kéo tệp nhị phân (dll) trong công cụ. Đối với cái sau, chọn "File -> new" trước

nhập mô tả hình ảnh ở đây


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.