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?
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?
Yanıtlar:
Bu hatayı önlemek için aşağıdakilerden birini yapabilirsiniz:
.NET-fu: İmzasız Bir Montajı İmzalama (Gecikme İmzalama Olmadan) bölümünde üçüncü taraf montajları imzalamaya ilişkin talimatları bulabilirsiniz .
Bir susuzluk partisini imzalamanın temel prensibi
ildasm.exe
Ara dili (IL) kullanarak montajı sökün ve kaydedin:
ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll
Derlemeyi yeniden kurun ve imzalayın:
ilasm /dll /key=myKey.snk thirdPartyLib.il
Üçü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
}
"Güçlü bir ad anahtarı olmayan" projeyi kullanan proje dosyasını genişletin ve .snk
dosyayı (.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,
<Browse>
için .snk
dosyanın daha önce bulunduHile 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.
Aynı soruna çözüm arıyordum ve "Montajı imzala" seçeneğinin işaretini kaldırıyorum benim için çalışıyor:
(ekran görüntüsünün VS2010'dan geldiğini fark edebileceğiniz gibi, umarım birisine yardımcı olur)
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.
Derlemeniz de işaretsizse işaretsiz derlemeler kullanabilirsiniz.
Üçü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 :
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
Ş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)
Projenizi imzalamak için yeni anahtar oluşturun.
D:/hiren> sn -k mykey.snk
Şimdi ilasm
komutunuzu kullanarak kitaplığınızı imzalayın .
D:/hiren> ilasm /dll /key=mykey.snk Test.il
sn
ildasm
veilasm
sn –k Cool.Library.snk
yeni bir anahtar çifti oluşturmak içinildasm Cool.Library.dll /out:Cool.Library.il
kütüphaneyi sökmekmove Cool.Library.dll Cool.Library.unsigned.dll
orijinal kütüphaneyi yedek olarak tutmak içinilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk
kütüphaneyi güçlü bir isimle yeniden bir araya getirmekpowershell -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.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.
"İ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.
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> Register-PackageSource -ProviderName NuGet -Name NuGet -Location http://www.nuget.org/api/v2
2> Install-Package -Name ILMerge
3> $env:path += ';C:\Program Files\PackageManagement\NuGet\Packages\ilmerge.2.14.1208\tools'
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
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
Ö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ı.