“Başvurulan derlemede güçlü bir ad yok” hatası nasıl düzeltilir?


242

Visual Studio 2005 projeme (kesinlikle adlandırılmış) zayıf adlandırılmış bir derleme ekledim . Şimdi hatayı alıyorum:

"Referans verilen derleme 'xxxxxxxx' güçlü bir ada sahip değil"

Bu üçüncü taraf meclisi imzalamam gerekir mi?



1
Bu aptalca bir ipucu gibi gelebilir, ancak ne yaparsanız yapın montajınızın imzalanmadığını fark ederseniz oluşturma ayarlarınızı kontrol edin; Unutmayın VS yeniden inşa / temiz diğer mimarileri (Herhangi bir CPU, x64, vb) temizlemez, bu yüzden başka bir mimariden eski bir dll bakarak olabilir.
jrh

Yanıtlar:


213

Bu hatayı önlemek için aşağıdakilerden birini yapabilirsiniz:

  • Montajı dinamik olarak yükleyin veya
  • Üçüncü taraf meclisi imzalayın.

.NET-fu: İmzasız Bir Montajı İmzalama (Gecikme İmzalama Olmadan) bölümünde üçüncü taraf montajları imzalamaya ilişkin talimatları bulabilirsiniz .

Üçüncü Taraf Meclisleri İmzalama

Bir susuzluk partisini imzalamanın temel prensibi

  1. ildasm.exeAra dili (IL) kullanarak montajı sökün ve kaydedin:

    ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll 
  2. Derlemeyi yeniden kurun ve imzalayın:

    ilasm /dll /key=myKey.snk thirdPartyLib.il

Ek Referansları Düzeltme

Üçüncü taraf meclisiniz ( A.dll ) de imzalanması gereken başka bir kütüphaneye ( B.dll ) başvurmadığı sürece yukarıdaki adımlar sorunsuz çalışır . Sen, sökmeye yeniden ve her iki giriş yapabilirsiniz A.dll ve B.dll yukarıdaki komutları kullanarak, ancak zamanında, yükleme B.dll çünkü başarısız olur A.dll aslen bir referansla inşa edilen imzasız sürümü B.dll .

Bu sorunun çözümü, yukarıdaki 1. adımda oluşturulan IL dosyasını düzeltmektir. Referansa B.dll genel anahtar belirtecini eklemeniz gerekir. Bu jetonu arayarak alırsınız

sn -Tp B.dll 

hangi size aşağıdaki çıktıyı verecektir:

Microsoft (R) .NET Framework Strong Name Utility  Version 4.0.30319.33440
Copyright (c) Microsoft Corporation.  All rights reserved.

Public key (hash algorithm: sha1):
002400000480000094000000060200000024000052534131000400000100010093d86f6656eed3
b62780466e6ba30fd15d69a3918e4bbd75d3e9ca8baa5641955c86251ce1e5a83857c7f49288eb
4a0093b20aa9c7faae5184770108d9515905ddd82222514921fa81fff2ea565ae0e98cf66d3758
cb8b22c8efd729821518a76427b7ca1c979caa2d78404da3d44592badc194d05bfdd29b9b8120c
78effe92

Public key token is a8a7ed7203d87bc9

Son satır, ortak anahtar belirtecini içerir. Daha sonra B.dll referans için A.dll IL aramak ve belirteci aşağıdaki gibi eklemeniz gerekir:

.assembly extern /*23000003*/ MyAssemblyName
{
  .publickeytoken = (A8 A7 ED 72 03 D8 7B C9 )                         
  .ver 10:0:0:0
}

2
Montajı bir seçenek olarak imzalamak, ne montajı dinamik olarak yüklemek ne de imzalamak istiyorum. Güçlü bir isimlendirmenin Global Assembly Cache (GAC) ile ilgili olduğunu biliyorum. Rağmen, meclisleri GAC parçası yapmak istemiyorum ve onlar da COM-görünür. Bu derlemenin imzalanmadan kullanılmasına izin verecek bir şeyler yapabileceğimizi kısmen hatırlıyorum. Seçeneklerin bir yerinde ya da öylesine. Bu yoldan gitmek istemiyorum.
Marcouiller

27
Derlemeniz de işaretsizse işaretsiz derlemeler kullanabilirsiniz.
OJ.

2
.NET-fu bağlantısı harika bir kaynak
TheDude

2
Yukarıdaki adımlar "en" durumlarda işe yarar olsa da, inanılmaz derecede zaman alıcı ve hata eğilimli ve diğer şeylerin yanı sıra arkadaş montaj referansları ile başarısız. Hepsini otomatik olarak yapmak için bu yardımcı programı kullanın (utanmaz fiş): stackoverflow.com/a/19459609/564726
BrutalDev

1
@Roel Burada süreci ayrıntılı olarak anlattım delabs.io/the-12th-labor-of-a-net-developer-part-4
TheDude

98

"Güçlü bir ad anahtarı olmayan" projeyi kullanan proje dosyasını genişletin ve .snkdosyayı (.StrongNameKey) arayın.

Windows Gezgini'nde bu dosyaya göz atın (nerede olduğunu bilmeniz için).

Visual Studio'da "güçlü bir ad anahtarı olmayan" projede,

  • Proje dosyasına sağ tıklayın
  • Özellikler seçin
  • "İmzalama sekmesi" ni seçin (solda)
  • "Montajı imzala" onay kutusunu tıklayın
  • Ardından <Browse>için .snkdosyanın daha önce bulundu

Hile yapmalı. Bu, aynı çözümde başka bir projenin içindeki formu kullanarak bir proje için benim için bir sorunu çözdü.

Umut ediyorum bu yardım eder.


Meclisimi imzalamak istemeseydim, en başından beri imzalamazdım!
mohas

.Snk dosyasını bulamazsanız: Proje özelliklerini (projeyi "güçlü ad" hatasıyla kullanan projenin) açın, İmzalama sekmesi. Orada projeyi imzalamak için kullanılan dosyayı göreceksiniz (her zaman .snk uzantılı bir dosya değildir). Bu ayarı diğer projeye kopyalamanız yeterlidir.
Coder14

MrOli3000'in işaret ettiği gibi, SADECE güçlü isim anahtarı dosyasını eksik olan bir çözüm varsa çalışır. İmzasız projeye başvuracak birden fazla proje varsa, çakışmalardan kaçınmak için yeni bir güçlü ad anahtar dosyası oluşturmak daha iyidir. Benim durumumda, çözüm oluşmadı ve düzeltmeye çalışan çevrelere gidiyordum. VS2017'den itibaren format .sfk değil .pfx'dir, ancak adımlar aynıdır - Çözüme sağ tıklayın ve özellikleri seçin. Solda listelenen sekmelerden "İmzalama" yı seçin. Onay kutusunu tıklayın ve yeni ... bir ad girin! ve Voila! yapılır!)
Raj

59

Aynı soruna çözüm arıyordum ve "Montajı imzala" seçeneğinin işaretini kaldırıyorum benim için çalışıyor:

resim açıklamasını buraya girin

(ekran görüntüsünün VS2010'dan geldiğini fark edebileceğiniz gibi, umarım birisine yardımcı olur)


MVC projemde bu ayarı kontrol etmiyorum. Ama yine de bağımlılıklardan şikayet ediyor. MVC için başka bir ayar var mı?
Hamid Mayeli

51

Kaynak koduna sahip olmayanlar veya terk edilmiş projeler de dahil olmak üzere otomatik olarak güçlü ad işareti derlemelerine bir araç yazdım. Cevaplarda açıklanan tekniklerin çoğunu, mevcut araçların veya tarihli talimatların kusurları veya dezavantajları olmadan basit bir şekilde kullanır.

http://brutaldev.com/post/2013/10/18/NET-Assembly-Strong-Name-Signer

Umarım bu, oraya ulaşmak için çemberlerden atlamak zorunda kalmadan üçüncü taraf bir meclis imzalaması gereken herkese yardımcı olur.



23

Üçüncü taraf meclisini imzalamak benim için çalıştı:

http://www.codeproject.com/Tips/341645/Referenced-assembly-does-not-have-a-strong-name

DÜZENLEME : Bağlantılı makalenin artık geçerli olmaması durumunda adımları göndermenin yararlı olduğunu öğrendim. Tüm kredi Hiren Khirsaria'ya gider :

  1. Visual studio komut istemini çalıştırın ve DLL dosyanızın bulunduğu dizine gidin.

    For Example my DLL is located in D:/hiren/Test.dll

  2. Şimdi aşağıdaki komutu kullanarak IL dosyasını oluşturun.

    D:/hiren> ildasm /all /out=Test.il Test.dll (bu komut kod kitaplığını oluşturur)

  3. Projenizi imzalamak için yeni anahtar oluşturun.

    D:/hiren> sn -k mykey.snk

  4. Şimdi ilasmkomutunuzu kullanarak kitaplığınızı imzalayın .

    D:/hiren> ilasm /dll /key=mykey.snk Test.il


Bağlantınız hile yaptı! Ve mykey.snk'nin nasıl oluşturulacağını açıklıyor (diğer cevaplar nasıl olduğunu söylemiyor)
Nicolas VERHELST

15

İmzasız üçüncü taraf meclisi nasıl imzalanır

  1. Visual Studio için Geliştirici Komut İstemi'ni açın. Bu araç Pencere programlarınızda bulunur ve varsayılan Windows araması kullanılarak bulunabilir.
  2. İsteminizin aşağıdaki araçlara bir kez çalışarak erişebildiğinden emin olun: sn ildasmveilasm
  3. Cool.Library.dll dosyasının bulunduğu klasöre gidin
  4. sn –k Cool.Library.snk yeni bir anahtar çifti oluşturmak için
  5. ildasm Cool.Library.dll /out:Cool.Library.il kütüphaneyi sökmek
  6. move Cool.Library.dll Cool.Library.unsigned.dll orijinal kütüphaneyi yedek olarak tutmak için
  7. ilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk kütüphaneyi güçlü bir isimle yeniden bir araya getirmek
  8. powershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll"derleme tam adı almak için. Web.config veya app.config gibi harici yapılandırma dosyalarında DLL'ye başvurmanız gerekiyorsa bu bite ihtiyacınız olacaktır.

6

Güçlü bir şekilde adlandırılmış bir derleme başvurmak için değiştirmek zorunda kaldı sonra güçlü bir uygulama için bu sorunu vardı, bu yüzden proje özellikleri İmzalama bölümünde 'derleme imzala' işaretini kaldı ama yine de şikayet etti. Diğer her şeyi doğru yaptığım için bir yerde soruna neden olan bir eser olması gerektiğini düşündüm ve sadece buydu. Ben: [assembly: AssemblyKeyFile ("yourkeyfilename.snk")] satırını assemblyInfo.cs dosyasından buldum ve kaldırdım. Sonra hiçbir şikayet inşa.


Teşekkür ederim! Cevabınız nedeniyle sorunum için tekrar kontrol ettim (ClosedXML) ve ClosedXML.Signed nuget paketini de buldum.
Kiryl

6

Ben nuget ile yüklü vardı bir ServiceStack dll ile bu koşuyordu. İmzalı olarak etiketlenmiş başka bir dizi dll olduğu ortaya çıkıyor. Herkesin cevabı olmayacak, ancak montajınızın mevcut imzalı bir sürümünü kontrol etmeniz gerekebilir.ServiceStack.Signed


2

Benim için sorunum, farklı Sürümler ile aynı NuGet Paketlerinden ikisinin yüklü olmasıydı.


2

"İmza" sekmesinin altındaki "Montajı imzala" onay işaretini kaldırmak @Michal Stefanow'un dediği gibi çalışıyor.

Buraya, kendi dosyalarınızı ve / veya diğer kişilerin dosyalarınızı imzalamanın en basit yoludur. Bu satırı "Post-build event komut satırı" altına eklemeniz yeterlidir:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\signtool.exe" sign /f "$(ProjectDir)\YourPfxFileNameHere.pfx" /p YourPfxFilePasswordHere /d "Your software title here" /du http://www.yourWebsiteHere.com /t http://timestamp.verisign.com/scripts/timstamp.dll /v "$(BaseOutputPath)$(TargetFileName)"

Diğer kişilerin dosyalarını veya kendi dosyalarınızı istediğiniz kadar imzalayabilirsiniz.

resim açıklamasını buraya girin


5
Bu farklı bir imza. OP'nin sorduğu şey, güçlü bir adla bir .NET derlemesinin nasıl imzalanacağıdır. Bir yürütülebilir dosyayı kod imzalama sertifikasıyla nasıl imzalayacağınızı gösteriyorsunuz. Farklı şeyler.
Blue Toque

2

Eski soru, ama henüz kimsenin ilmerge'den bahsetmediğine şaşırdım. ilmerge Microsoft'tan geliyor, ancak VS veya SDK'larla gönderilmiyor. Yine de buradan indirebilirsiniz . Bir github deposu da var. Nuget'ten de yükleyebilirsiniz:

PM>Install-Package ilmerge

Kullanmak:

ilmerge assembly.dll /keyfile:key.snk /out:assembly.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug

Gerekirse, sn (VS'den) kullanarak kendi anahtar dosyanızı oluşturabilirsiniz:

sn -k key.snk

1
WireMock.Net ile ilgili bir sorunum vardı, sonunda işe yaradı, ancak PowerShell komutlarını bulmak için biraz zaman ayırdım. Özellikle sonunda / lib argümanlarının tamamı sonunda ILMerge'i derlemeyi imzalayacak.
François

1> Register-PackageSource -ProviderName NuGet -Name NuGet -Location http://www.nuget.org/api/v2
François

2> Install-Package -Name ILMerge
François

3> $env:path += ';C:\Program Files\PackageManagement\NuGet\Packages\ilmerge.2.14.1208\tools'
François

4> ILMerge.exe .\packages\WireMock.Net.1.0.4.2\lib\net452\WireMock.Net.dll /keyfile:key.snk /out:WireMock.Net.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug /lib:.\packages\Newtonsoft.Json.10.0.3\lib\net45\ /lib:.\packages\Handlebars.Net.1.9.0\lib\net40 /lib:.\packages\SimMetrics.Net.1.0.4\lib\net45 /lib:.\packages\Microsoft.Owin.2.0.2\lib\net45 /lib:.\packages\Owin.1.0\lib\net40 /lib:.\packages\Microsoft.Owin.Hosting.2.0.2\lib\net45 /lib:.\packages\MimeKitLite.2.0.1\lib\net45 /lib:.\packages\XPath2.1.0.5.1\lib\net40 /lib:.\packages\RestEase.1.4.4\lib\net45
François

1

Durum: X, Y çözeltisinde A, B, C, D projeniz vardı

Proje A, B, C, X Proje A, C, D, Y

A projesinde C projesini kullanmam gerekiyor, ancak daha sonra kullanmıyorum. Bin Debug projesinde A C.dll vardı.

X çözümünü derlersem, hepsi iyi (bu çözümde referans A -> C'yi silerim), ancak çözüm YI'de bu sorunu alırım.

Çözüm A Bin Debug projesinde C.dll silmek


0

Öncelikle çözümünüzdeki tüm projelerde tüm nuget paketlerinin aynı sürümde olduğundan emin olun. örneğin bir projenin NLog 4.0.0.0'a başvurmasını ve başka bir projenin NLog 4.1.0.0'a başvurmasını istemezsiniz. Sonra nuget paketlerini

Güncelleme Paketi

A derlemem tarafından atıfta bulunulan 3 3. parti derlemem vardı ve yalnızca 2, A derlemesine de başvuran B derlemem tarafından yapılan Referanslara dahil edildi.

Üçüncü taraf derlemesine eksik başvuru, güncelleştirme paketi komutu tarafından eklendi ve hata ortadan kalktı.

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.