特定のdllのPublicKeyTokenを見つけるにはどうすればよいですか?


197

次のようなプロバイダーを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を検索するにはどうすればよいですか?

または、これで完全に間違った方向に進んでいますか?


回答:


282

PowerShellを使用すると、次のステートメントを実行できます。

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

以下のように、出力にはVersionCulture、およびPublicKeyTokenが含まれます。

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

1
ありがとう!あなたの方法は私のために働いた唯一のものですsn -T dllname.dllは私がそれを実行したときにのみヘルプテキストを表示します
Vdex

1
それは最高です!追加のツールのインストールを回避します。
nirav 2015

1
すごい!これは、使用可能なPublicKeyTokenがない場合(つまり、署名されていないアセンブリ)でも機能します
MovGP0

2
C#Interactiveでは、次を呼び出すことができます。Console.WriteLine(System.Reflection.Assembly.LoadFile(@ "c:\ some.dll")。FullName);
Auri Rahimzadeh 2017年

2
不愉快なことに、PowerShell.exeは呼び出しが完了した後でもDLLをロックし続けます。ソリューションを再構築する前に、PowerShellコンソールを閉じる必要がありました。
Cee McSharpface 2018年

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:の次の場所のいずれかにあります。 \ 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

キーは大文字と小文字が区別されます。-t(小文字)は、「キーをトークンに変換できませんでした-無効なアセンブリ公開キーです。」と表示し、検索を間違った方向に送信します。
access_granted

31

DLLをプロジェクトに追加した場合、csprojファイルを開いてReferenceタグを確認できます。

例:

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

23

sn -T <assembly>Visual Studioコマンドライン。アセンブリがグローバルアセンブリキャッシュにインストールされている場合はC:\Windows\assembly、GACアセンブリのリストに移動して見つけやすくなります。

特定のケースでは、タイプのフルネームとアセンブリ参照を混在させている可能性があります。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
Copyright(c)Microsoft Corporation。全著作権所有。

公開鍵トークンはb77a5c561934e089です

あなたは、Visual Studio 2013持っていて、それを修正する方法こちらをご覧GO「VS2013のためのプロンプト開発コマンド」を見つけることができない場合は、次のstackoverflow.com/a/22702405/187650
juFo

このツールはWindowsには付属していません。
Ian Boyd

4

Windowsエクスプローラーを使用して、C:\ Windows \ assemblyに移動し、必要なものを見つけます。プロパティから、PublicKeyTokenをコピーできます。

これは、インストールされているVisual Studioまたはその他のユーティリティに依存しません。


3

さらに情報を追加しただけで、上記の場所にsn.exeユーティリティが見つかりませんでした。私の場合は、C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ binにありました。


ビジュアルスタジオのコマンドプロンプトを開くと、パス上にあるはずです。
Nattrass

このアウトをチェックしてください:stackoverflow.com/questions/3045033/...
ThePatelGuy

2

Assembly.LoadFile(@ "C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ system.data.dll")。FullName

結果として

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ファイルをメモ帳で開きます。ここで公開鍵トークンを確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.