.Net 어셈블리의 PublicKeyToken 얻기


163

어셈블리의 공개 키 토큰을 찾는 가장 간단한 방법은 무엇입니까?

내가 생각할 수있는 가장 간단한 방법은 마우스 오른쪽 버튼을 클릭하고 공개 키를 얻는 것입니다.하지만이 기능이 없습니다. 아마도 Visual Studio Extension이 있습니까?

확장 프로그램을 사용할 수 있으면 Visual Studio 2010을 사용하고 있습니다.


4
Kirk Evans의이 블로그 게시물에서 Visual Studio 내 어셈블리의 PublicKeyToken을 얻는 방법을 참조하십시오. blogs.msdn.com/b/kaevans/archive/2008/06/18/…
Martin Buberl

2
방금 EF6을 설치했으며 어셈블리 위치를 정직하게 알지 못합니다. 이런 식으로 내 하루의 시간이 걸립니다.
froggythefrog 2018 년

답변:


228

명령 프롬프트를 열고 Visual Studio 버전 및 운영 체제 아키텍처에 따라 다음 줄 중 하나를 입력하십시오.

32 비트 Windows에서 VS 2008 :

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

64 비트 Windows의 VS 2008 :

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

32 비트 Windows에서 VS 2010 :

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

64 비트 Windows에서 VS 2010 :

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

32 비트 Windows에서 VS 2012 :

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

64 비트 Windows에서 VS 2012 :

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

64 비트 Windows에서 VS 2015 :

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

버전 VS2012 +의 경우 sn.exe 응용 프로그램은 더 이상 저장소가 아니라 하위 폴더에 있습니다. 또한 64 비트의 경우 (x86) 폴더를 지정해야합니다.

Visual Studio 명령 프롬프트를 사용하려면 다음을 입력하십시오.

sn -T <assembly> 

어디 <assemblyname> 관심이있는 어셈블리의 전체 파일 경로이며 공백이 있으면 따옴표로 묶습니다.

다음과 같이 VS에서 외부 도구로 추가 할 수 있습니다 :
http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token -s-a-stong-named-assembly.aspx


1
그래, 나는 VS를 떠나지 않고 더 쉬운 방법을 찾고 있음을 알고있다
moi_meme

12
64 비트 컴퓨터 인 경우 % ProgramFiles %를 % ProgramFiles (x86) %로 바꾸십시오.
System.Cats.Lol

1
VS2012의 경우 아래에 "%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>있습니다. 참고 sn은 bin (NETFX 4.0 도구) 다음에 하나의 추가 폴더 레벨에 고정됩니다.
GDS

2
정교하고 정답입니다. VS2015 것이 %의의 ProgramFiles (86) % \ 마이크로 소프트의 SDK \ WINDOWS \ v10.0A \ bin에 있어야한다 \으로 netfx 4.6.1 도구 \ Sn.exe를
ThePatelGuy

1
VS2015 경로는 v10.0A하지 V1.0A해야한다
마이클 Itzoe

87

다른 옵션 :

PowerShell을 사용하면 다음과 같은 내용을 알 수 있습니다.

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

처럼

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

와 같이 나타납니다

MySql.Data, 버전 = 6.6.5.0, Culture = neutral, PublicKeyToken = c5687fc88969c44d


조립품을 수동으로 추가하는 경우 전체 결과를 웹 구성에 바로 복사하여 붙여 넣을 수 있습니다. 감사!
GJKH

버전도 얻을 수 있으므로 문제 해결에 중요 할 수 있습니다.
sbkrogers

48

라이브러리가 VS 프로젝트에 포함 된 경우 .cproj파일 을 확인할 수 있습니다 ( 예 :

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

2
<Reference Include = "System.IdentityModel"/> (다른 어셈블러와 동일) 만 표시
FrenkyB

.NET 시스템 라이브러리의 어셈블리에는별로 사용되지 않는 것 같습니다. 예를 들어 System.Configuration의 경우<Reference Include="System.Configuration" />
Simon

모든 어셈블리가 동일한 것처럼 PublicKeyToken보이므로 하나를 찾는 .cproj것이 가장 쉬운 솔루션 인 것 같습니다.
asdf

14

프로젝트에 어셈블리를 포함시킨 경우 다음을 수행 할 수 있습니다.

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


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

내 참조에 dll의 공개 키 토큰이 없습니다. 방법이 실제로 특정 프로젝트의 참조에서 모든 dll을 가져 옵니까? 감사합니다
Francis Saul

@FrancisSaul-응용 프로그램의 프로세스 메모리에로드 된 어셈블리 만 나열합니다. 특정 어셈블리에 대한 세부 정보를 보려면 먼저 해당 어셈블리의 일부 유형을 참조하는 코드를 실행하십시오. 예를 들어 해당 어셈블리에서 일부 클래스의 새 인스턴스를 만듭니다.
ToolmakerSteve

이것은 나를 위해 일한 가장 간단한 방법이었습니다. 추가로 단순화 할 수 있습니다. 중단 점 세트로 애플리케이션을 실행하십시오. 중단 점에서 실행이 일시 중지되면 VS 직접 실행 창에서 다음을 입력하십시오 AppDomain.CurrentDomain.GetAssemblies(). 그러면 직접 창에로드 된 어셈블리와 버전, Culture 및 PublicKeyToken이 나열됩니다.
Simon Tewsi

컴파일 할 필요없이 'C # Interactive'에서 실행할 수도 있습니다!
bTab

13

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

코드를 시도했지만 작동하지 않습니다. 이미 내 참조에있는 Stimulsoft.Report.Web.dll의 공개 키 토큰을 얻고 싶습니다. 코드를 복사하고 dll 이름을 전달했지만 작동하지 않습니다. 내 코드는 다음과 같습니다. string s = GetPublicKeyTokenFromAssembly ( "Stimulsoft.Report.Web"). 분명히 메서드는 문자열 이름이 아닌 assembly를 허용합니다. 분석법 사용법을 알려 주시겠습니까?
Francis Saul

@FrancisSaul 메소드가 "없음"또는 잘못된 값을 반환하는 것은 무엇입니까? 어셈블리 이름이 실제로 강력한 지 확인 했습니까? 속성 패널의 VS에서 참조 (강한 이름)를 확인할 수 있습니다. JustDecompile과 같은 대부분의 무료 디 컴파일러로 쉽게 확인할 수 있습니다. 이름이 강한 것으로 보이면 코드를 디버그하고 바이트를 검사하십시오.
Adam Caviness

코드 문자열 s = GetPublicKeyTokenFromAssembly ( "Stimulsoft.Report.Web")를 입력 한 후 프로젝트를 실행할 수 없습니다. 메서드에 대한 최상의 오버로드에 잘못된 인수가 있다고합니다.
Francis Saul

@FrancisSaul 어셈블리를 취하는 메소드에 문자열 인수를 전달합니다. 당신은 할 수 typeof(YourPreferredTypeInThatAssembly).Assembly또는 Assembly.GetAssembly(typeof(YourPreferredTypeInThatAssembly))당신이 좋아하는 경우에 방법에 그것을 전달합니다.
Adam Caviness

구문은 다음과 같습니다. Assembly.GetAssembly (typeof ( "Stimulsoft.Report.Web.dll));
Francis Saul

9

다음과 같이이를 Visual Studio에 외부 도구로 추가 할 수 있습니다.

표제:

Get PublicKeyToken

명령:

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

(버전마다 경로가 다를 수 있음)

인수 :

-T "$(TargetPath)"

" 출력 창 사용 "옵션을 확인하십시오 .


1
당신이에서이 옵션을 선택하면 Tools메뉴가 자동으로 프로젝트 당신이 솔루션 탐색기에서 선택한 무엇에 작동합니다.
Contango

명령 이름을로 변경했습니다 Get PublicKeyToken on Solution Explorer Selection.
Contango

1
좋은 대답입니다! 힌트 : "인수 프롬프트"확인란을 활성화하면 경로를 붙여 넣을 수있는 대화 상자가 열립니다. 예를 들어 속성 ​​창에서 어셈블리 경로를 복사하여 붙여 넣을 수 있습니다. 이는 특히 web.config에서 등록을 변경해야하고 DLL 공개 키 토큰을 알지 못하는 경우에 매우 유용했습니다.
Matt


5

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

위 예제에서 Microsoft SDK는 C : \ Program Files \ Microsoft SDKs \ Windows \ v6.0A에 있습니다. 환경이 다를 수 있습니다.

2) 프로젝트의 공개 키 토큰을 얻으려면 Visual Studio에서 외부 도구의 일부로 sn.exe를 추가 할 수 있습니다. 단계는 이 Microsoft 링크에 표시됩니다 . 방법 : 어셈블리의 공개 키를 가져 오는 도구 만들기


그래, 나는 VS를 떠나지 않고 더 쉬운 방법을 찾고 있음을 알고있다
moi_meme


5

대안으로 다음 linq과 같이 사용할 수도 있습니다.

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

1
그는 공개 키 토큰을 요청했습니다. 코드는 공개 키를 사용합니다. 그것은해야합니다.GetPublicKeyToken()
스테판 출생

1

다른 방법은 디 컴파일러가있는 경우 찾아 보면 일반적으로 공개 키를 제공하는 것입니다. .Net Reflector, Telerik Just Decompile 및 ILSpy를 살펴보면 공개 키 토큰이 표시된 것처럼 보입니다.


1

또 다른 옵션은 오픈 소스 도구 인 NuGet Package Explorer 를 사용하는 것입니다.

Nuget 패키지 (.nupkg)에서 PublicKeyToken을 확인하거나 도구에서 이진 (.dll)을 드래그 할 수 있습니다. 후자를 위해 먼저 "파일-> 새"를 선택하십시오.

여기에 이미지 설명을 입력하십시오


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.