.NetアセンブリのPublicKeyTokenを取得する


163

アセンブリの公開キートークンを見つける最も簡単な方法は何ですか?

私が考えることができる最も簡単な方法は、単純な右クリックで公開鍵を取得することですが、この機能はありません。おそらくそのためのVisual Studio Extensionがありますか?

拡張機能が利用可能な場合は、Visual Studio 2010を使用しています。


4
Visual Studioの内のアセンブリのなPublicKeyTokenを取得する方法カーク・エヴァンスからこのブログ記事を参照してください。blogs.msdn.com/b/kaevans/archive/2008/06/18/...
マーティンBuberl

2
EF6をインストールしたばかりで、アセンブリの場所が正直にわかりません。このようなクラップは私の一日の時間がかかります。
froggythefrog 2014年

回答:


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アプリケーションはbinではなくサブフォルダーにあることに注意してください。また、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 -for-a-stong-named-assembly.aspx


1
ええ、私は、できればVSを離れることなく、より簡単な方法を探していることを知っています
moi_meme

12
64ビットマシンを使用している場合は、%ProgramFiles%を%ProgramFiles(x86)%に置き換えます。
System.Cats.Lol 14

1
VS2012の場合は、下にあり"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>ます。snは、(NETFX 4.0ツールでは)binの後に1つの追加のフォルダーレベルに隠れています。
GDS

2
素敵な精巧な答え。VS2015の場合、%ProgramFiles(x86)%\ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Tools \ sn.exe
ThePatelGuy

1
VS2015のパスはV1.0Aではなくv10.0Aにする必要があります
Michael Itzoe 2017

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、カルチャー=ニュートラル、PublicKeyToken = c5687fc88969c44d


すばらしいです。手動でアセンブリを追加する場合、結果全体を直接Web構成にコピーして貼り付けることができます。ありがとう!
GJKH 2015

バージョンも取得できるため、正解です(これはトラブルシューティングに重要な場合があります)。
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 '11年

.NETシステムライブラリのアセンブリにはあまり使用されないようです。たとえば、System.Configurationの場合は次のようになります<Reference Include="System.Configuration" />
Simon Tewsi

すべてのアセンブリが同じPublicKeyTokenであるように見えるので、1つのルックアップが.cproj最も簡単な解決策のようです。
asdf

14

プロジェクトにアセンブリを含めた場合、次のことができます。

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


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

私の参照にあるdllの公開キートークンを取得していません。あなたの方法は本当に特定のプロジェクトの参照ですべてのdllを取得していますか?感謝
フランシス・サウル

@FrancisSaul-アプリケーションのプロセスメモリにロードされたアセンブリのみがリストされます。特定のアセンブリの詳細を表示するには、そのアセンブリのある型を参照するコードを最初に実行します。たとえば、そのアセンブリにあるクラスの新しいインスタンスを作成します。
ToolmakerSteve 2017年

これは私にとっては最も簡単な方法でした。さらに簡略化できます。ブレークポイントを設定してアプリケーションを実行します。ブレークポイントで実行が一時停止すると、VSイミディエイトウィンドウで次のように入力しますAppDomain.CurrentDomain.GetAssemblies()。これにより、ロードされたアセンブリがイミディエイトウィンドウにリストされ、それぞれにバージョン、カルチャ、およびPublicKeyTokenが表示されます。
Simon Tewsi

'C#Interactive'で実行することも可能です-コンパイルは必要ありません!
bTab 2018年

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

プロジェクトを実行できません。コード文字列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 2015年

コマンドの名前をに変更しましたGet PublicKeyToken on Solution Explorer Selection
Contango 2015年

1
いい答えだ!ヒント:「引数のプロンプト」チェックボックスを有効にすると、ダイアログが開き、パスを貼り付けることができます。たとえば、そこにあるプロパティウィンドウからアセンブリパスをコピーして貼り付けることができます。これは、特にweb.configで登録を変更する必要があり、DLLの公開キートークンを知らなかった場合に、非常に役立ちました。
マット

8

私にとって最も簡単な方法はILSpyを使用することです

アセンブリをウィンドウにドラッグアンドドロップし、ドロップしたアセンブリを左側で選択すると、ウィンドウの右側に公開キートークンが表示されます。

(必要に応じて、新しいバージョンでも署名の公開鍵が表示されると思います... https://github.com/icsharpcode/ILSpy/issues/610#issuecomment-111189234を参照してください。いい物! ;))


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リンクに示されています。方法:アセンブリの公開キーを取得するツールを作成する




5

別の方法として、次のlinqように使用することもできます-

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

1
彼は公開鍵トークンを求めました。コードは公開鍵を使用します。それはあるはずです.GetPublicKeyToken()
ステファンは

1

別の方法としては、逆コンパイラーがある場合は、そこで検索するだけで、通常は公開鍵を提供します。.Net Reflector、Telerik Just Decompile、ILSpyを逆コンパイルしたところ、公開鍵トークンが表示されているようです。


1

もう1つのオプションは、オープンソースツールのNuGet Package Explorerを使用することです。

Nugetパッケージ(.nupkg)から、PublicKeyTokenを確認するか、バイナリ(.dll)をツールにドラッグできます。後者の場合、最初に「ファイル->新規」を選択します

ここに画像の説明を入力してください


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