.Net derlemelerinden PublicKeyToken'i alma


163

Bir montajın Açık Anahtar Kodunu bulmanın en kolay yolu nedir?

Düşünebileceğim en basit yol basit bir sağ tıklama, genel anahtar almak olabilir, ancak bu işlevsellik orada değil, belki bunun için bir Visual Studio Uzantısı var mı?

Bir uzantı varsa Visual Studio 2010 kullanıyorum.


4
Kirk Evans'ın Visual Studio'da bir meclisin PublicKeyToken'i nasıl alacağına dair bu blog gönderisine bakın: blogs.msdn.com/b/kaevans/archive/2008/06/18/…
Martin Buberl

2
EF6'yı yeni kurdum ve dürüstçe montajların nerede olduğunu bile bilmiyorum. Böyle saçma günüm saatler sürüyor.
froggythefrog

Yanıtlar:


228

Bir komut istemi açın ve Visual Studio sürümünüze ve İşletim Sistemi Mimarisine göre aşağıdaki satırlardan birini yazın:

32bit Windows'da VS 2008 :

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

64bit Windows'da VS 2008:

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

32bit Windows'da VS 2010:

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

64bit Windows'da VS 2010:

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

32bit Windows'da VS 2012:

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

64bit Windows'da VS 2012:

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

64bit Windows'ta VS 2015:

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

VS2012 + sürümleri için sn.exe uygulamasının artık depo gözünde değil, bir alt klasörde olduğunu unutmayın. Ayrıca, 64bit için (x86) klasörü belirtmeniz gerektiğini unutmayın.

Visual Studio komut istemini kullanmayı tercih ederseniz, şunu yazın:

sn -T <assembly> 

Burada <assemblyname>, ilgilendiğiniz montajın tam dosya yolu, boşlukları varsa tırnak işaretleri içine alınır.

Bunu, burada gösterildiği gibi VS'ye harici bir araç olarak ekleyebilirsiniz:
http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token -için-a-stong adlı-assembly.aspx


1
Evet biliyorum, tercihen VS ayrılmadan daha kolay bir yol arıyorum
moi_meme

12
64 bitlik bir makinedeyseniz% ProgramFiles% öğesini% ProgramFiles (x86)% ile değiştirin.
System.Cats.Lol

1
VS2012 için altında "%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>. Not, bin öğesinden sonra (NETFX 4.0 Tools) ekstra klasör seviyesinde gizlenir.
GDS

2
Güzel ayrıntılı cevap. VS2015 için% ProgramFiles (x86)% \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Tools \ sn.exe
ThePatelGuy

1
VS2015 yolu V1.0A değil v10.0A olmalıdır
Michael

87

başka seçenek:

PowerShell kullanıyorsanız şunları öğrenebilirsiniz:

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

sevmek

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

ve gibi görünecek

MySql.Data, Sürüm = 6.6.5.0, Kültür = nötr, PublicKeyToken = c5687fc88969c44d


Harika, montajları manuel olarak ekliyorsam tüm sonucu doğrudan bir web yapılandırmasına kopyalayıp yapıştırmama izin veriyor. Teşekkürler!
GJKH

Sürümü de alabileceğiniz için harika bir yanıt (sorun giderme için önemli olabilir).
sbkrogers

48

Kütüphane VS projesine dahil edilmişse, .cproj dosyayı , örneğin:

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

2
Sadece <Reference Include = "System.IdentityModel" /> (diğer asseblies için aynı) görüyorum
FrenkyB

.NET sistem kitaplıklarındaki derlemeler için fazla kullanılmıyor gibi görünüyor. örneğin System.Configuration için sadece diyor<Reference Include="System.Configuration" />
Simon Tewsi

Tüm montajların aynı PublicKeyTokenolduğu .cprojgörülüyor , bu yüzden bir bakış en kolay çözüm gibi görünüyor.
asdf

14

Derlemeyi projenize eklediyseniz şunları yapabilirsiniz:

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


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

Referanslarımdaki dll'lerin ortak anahtar belirtecini almıyor. Yönteminiz gerçekten belirli bir projenin referansları tüm dll alır mı? teşekkürler
Francis Saul

@FrancisSaul - yalnızca uygulamanızın işlem belleğine yüklenmiş olan derlemeleri listeler; belirli bir montajın ayrıntılarını görmek için, ilk olarak o montajdaki bir türle ilgili kodu çalıştırın. Örneğin, bu derlemede bir sınıfın yeni bir örneğini oluşturun.
ToolmakerSteve

Bu benim için çalışan en basit yöntemdi. Daha da basitleştirilebilir: Bir kesme noktası seti ile uygulamayı çalıştırın. Yürütme VS Anında Pencere tipi, kırılma noktasında duraklar zaman: AppDomain.CurrentDomain.GetAssemblies(). Bu, yüklenen montajları Anlık Pencerede listeler, her biri için Version, Culture ve PublicKeyToken.
Simon Tewsi

'C # Interactive' ile çalıştırmak da mümkün - derlemeye gerek yok!
bTab

13

Bunu c # ile kolayca alabilirsiniz

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

Kodunuzu denedim ama çalışmıyor. Zaten Referanslarım'da bulunan Stimulsoft.Report.Web.dll genel anahtar belirtecini almak istiyorum. Kodunuzu kopyaladım ve dll adını geçirdim ama çalışmıyor. Kodum şuna benzer: string s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web"). Açıkçası yöntem bir dize adı değil derlemeyi kabul ediyor. Metodunu nasıl kullanacağım konusunda bana yardım edebilir misin?
Francis Saul

@FrancisSaul Yöntem ne döndürür, "Yok" veya yanlış bir değer döndürür? Meclisin gerçekten güçlü bir isim olduğunu belirlediniz mi? Referans için özellikler panelinde VS'de doğrulayabilirsiniz (Kesin Ad). Bunu JustDecompile gibi çoğu ücretsiz dekomperi ile kolayca kontrol edebilirsiniz. Adının güçlü olduğunu görürseniz, kodda hata ayıklayın ve baytları inceleyin.
Adam Caviness

S = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web") kod dizesini yazdıktan sonra projeyi çalıştıramıyorum, yöntem için en iyi aşırı yük geçersiz argümanlar var diyor.
Francis Saul

@FrancisSaul Derleme alan bir yönteme dize argümanı geçiriyorsunuz. İsterseniz bunu typeof(YourPreferredTypeInThatAssembly).Assemblyveya Assembly.GetAssembly(typeof(YourPreferredTypeInThatAssembly))yönteme iletebilirsiniz.
Adam Caviness

Yani sözdizimi böyle olurdu. Assembly.GetAssembly (typeof ("Stimulsoft.Report.Web.dll));
Francis Saul

9

Bunu Visual Studio'ya şu şekilde harici bir araç olarak ekleyebilirsiniz:

Başlık:

Get PublicKeyToken

Komut:

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

(Yol sürümler arasında farklılık gösterebilir)

Argümanlar:

-T "$(TargetPath)"

Ve " Çıktı penceresini kullan " seçeneğini işaretleyin.


1
Bunu Toolsmenüden seçtiğinizde, Solution Explorer'da seçtiğiniz Proje üzerinde otomatik olarak çalışacaktır.
Contango

Komutumu yeniden adlandırdım Get PublicKeyToken on Solution Explorer Selection.
Contango

1
İyi cevap! İpucu: "Bağımsız değişkenler sor" onay kutusunu etkinleştirirseniz, içine bir yol yapıştırmanıza olanak tanıyan bir iletişim kutusu açılır. Böylece, örneğin özellikler penceresinden ciddi bir yol kopyalayıp yapıştırabilirsiniz. Özellikle web.config'deki kayıtları değiştirmek zorunda kaldığımda ve DLL'lerin ortak anahtar belirtecini bilmediğimde bu benim için çok yararlı oldu.
Matt


5

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

Yukarıdaki örnekte, Microsoft SDK C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A dizinindedir. Ortamınız farklı olabilir.

2) Projenizden herhangi birinin ortak anahtar belirtecini almak için, sn.exe dosyasını Visual Studio'daki Harici Araçlarınızın bir parçası olarak ekleyebilirsiniz. Bu Microsoft bağlantısında adımlar gösterilmiştir : Nasıl yapılır: Bir Derlemenin Genel Anahtarını Almak için Araç Oluşturma


Evet biliyorum, tercihen
VS'den


5

Alternatif olarak, bu şekilde de kullanabilirsiniz linq-

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

1
Ortak anahtar belirteci istedi. Kodunuz ortak anahtarı kullanıyor. O olmalı.GetPublicKeyToken()
Stefan Born

1

Alternatif bir yöntem, decompiler varsa, sadece oraya bakın, genellikle genel anahtarı sağlarlar. Net Reflektör, Telerik Just Decompile ve ILSpy sadece ortak anahtar belirtecinin görüntülenmesi gibi görünüyor.


1

Başka bir seçenek de NuGet Package Explorer açık kaynak aracını kullanmaktır kullanmaktır.

Bir Nuget paketinden (.nupkg) PublicKeyToken'i kontrol edebilir veya araçtaki ikili (.dll) öğesini sürükleyebilirsiniz. İkincisi için önce "Dosya -> yeni" yi seçin

resim açıklamasını buraya girin


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.