특정 dll에 대한 PublicKeyToken을 어떻게 찾을 수 있습니까?


198

web.config 파일에서 다음과 같은 공급자를 다시 만들어야합니다.

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

그러나이 어셈블리를로드 할 수 없다는 런타임 오류가 발생하며 잘못된 PublicKeyToken이 있기 때문이라고 생각합니다. 어셈블리에 대한 PublicKeyToken을 어떻게 조회합니까?

대안으로, 나는 이것으로 완전히 잘못 가고 있습니까?


답변:


284

PowerShell을 사용하면 다음 명령문을 실행할 수 있습니다.

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

출력은 아래와 같이 Version , CulturePublicKeyToken 을 제공합니다 .

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

1
감사! 당신의 방법은 나를 위해 일한 유일한 방법 sn -T dllname.dll 내가 그것을 실행할 때만 도움말 텍스트를 표시합니다
Vdex

1
저건 완벽 해! 추가 도구를 설치하지 않습니다.
nirav

1
큰! 이것은 사용 가능한 PublicKeyToken이없는 경우에도 작동합니다 (예 : 서명되지 않은 어셈블리)
MovGP0

2
C # Interactive에서 다음을 호출 할 수 있습니다. Console.WriteLine (System.Reflection.Assembly.LoadFile (@ "c : \ some.dll"). FullName);
Auri Rahimzadeh

2
짜증나게도 PowerShell.exe는 호출이 완료된 후에도 dll을 잠급니다. 솔루션을 다시 빌드하기 전에 PowerShell 콘솔을 닫아야했습니다.
Cee McSharpface

141

sn.exe 유틸리티 사용 :

sn -T YourAssembly.dll

또는 Reflector에 어셈블리로드 .


31
sn.exe는 일반적으로 C : \ Program Files (x86) \ Microsoft SDKs \ Windows의 다음 위치 중 하나에 있습니다. C : \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin, C : \ 프로그램 파일 (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64, C : \ 프로그램 파일 (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 도구
david.barkhuizen

키는 대소 문자를 구분합니다. -t (소문자)는 "키를 토큰으로 변환하지 못했습니다-잘못된 어셈블리 공개 키"를 제공하여 잘못된 방향으로 검색합니다.
access_granted

31

DLL을 프로젝트에 추가 한 경우 csproj 파일을 열고 참조 태그를 볼 수 있습니다.

예:

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

23

sn -T <assembly>Visual Studio 명령 줄에서. 전역 어셈블리 캐시에 어셈블리가 설치되어 있으면 C:\Windows\assemblyGAC 어셈블리 목록에서 쉽게 찾을 수 있습니다.

특정 경우에 어셈블리 이름과 형식 이름을 혼합하는 경우 MSDN을 살펴볼 수 있습니다 .


8

대답은 .NET Framework 도구를 사용하는 것이 매우 간단합니다 sn.exe. Visual Studio 2008 명령 프롬프트를 연 다음 공개 키를 얻으려는 dll 폴더를 가리키고,

다음 명령을 사용하십시오

sn –T myDLL.dll

공개 키 토큰이 제공됩니다. 어셈블리에 강력하게 서명해야하는 경우에만 작동합니다.

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

Microsoft (R) .NET Framework 강력한 이름 유틸리티 버전 3.5.21022.8
저작권 (c) Microsoft Corporation. 판권 소유.

공개 키 토큰은 b77a5c561934e089입니다.

Visual Studio 2013이 있고 "VS2013 용 개발자 명령 프롬프트"를 찾을 수없는 경우 여기에서 해결 방법을 살펴보십시오. stackoverflow.com/a/22702405/187650
juFo

이 도구는 Windows와 함께 제공되지 않습니다.
이안 보이드

4

Windows 탐색기를 사용하고 C : \ Windows \ assembly로 이동하여 필요한 것을 찾으십시오. 속성에서 PublicKeyToken을 복사 할 수 있습니다.

이것은 Visual Studio 또는 설치되는 다른 유틸리티에 의존하지 않습니다.


3

더 많은 정보를 추가하면 언급 한 위치에서 sn.exe 유틸리티를 찾을 수 없었습니다. 제 경우에는 C : \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin에 있습니다.


Visual Studio 명령 프롬프트를 열면 경로에 있어야합니다.
Nattrass

이것을 확인하십시오 : stackoverflow.com/questions/3045033/…
ThePatelGuy

2

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

결과

System.Data, 버전 = 4.0.0.0, 문화 = 중립, PublicKeyToken = b77a5c561934e089


1

@CRice가 말했듯이 아래 방법을 사용하여 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;
}

나는 일반적으로 LinqPad 스크립트 로 사용합니다.

DependencyInfo("@c:\MyAssembly.dll"); 코드에서


0

다음 방법으로 확인할 수도 있습니다.

실행으로 이동 : 공개 키가 필요한 DLL의 경로를 입력하십시오. 2 개의 파일이 있습니다. 1. __AssemblyInfo_.ini 2. DLL 파일

이 __AssemblyInfo_.ini 파일을 notepad에서 열면 공개 키 토큰이 표시됩니다.

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