Saya telah menambahkan perakitan dengan nama lemah ke proyek Visual Studio 2005 saya (yang sangat dinamai). Saya sekarang mendapatkan kesalahan:
"Perakitan yang direferensikan 'xxxxxxxx' tidak memiliki nama yang kuat"
Apakah saya perlu menandatangani majelis pihak ketiga ini?
Jawaban:
Untuk menghindari kesalahan ini, Anda dapat:
Anda akan menemukan petunjuk tentang cara menandatangani majelis pihak ketiga di .NET-fu: Menandatangani Majelis yang Tidak Ditandatangani (Tanpa Penandatanganan Penundaan) .
Menandatangani Majelis Pihak Ketiga
Prinsip dasar untuk menandatangani pihak ketiga adalah untuk
Bongkar perakitan menggunakan
ildasm.exe
dan menyimpan bahasa perantara (IL):Bangun kembali dan tandatangani majelis:
Memperbaiki Referensi Tambahan
Langkah-langkah di atas berfungsi dengan baik kecuali jika perakitan pihak ketiga Anda ( A.dll ) referensi perpustakaan lain ( B.dll ) yang juga harus ditandatangani. Anda dapat membongkar, membangun kembali dan menandatangani kedua A.dll dan B.dll menggunakan perintah di atas, tetapi pada saat runtime, pemuatan B.dll akan gagal karena A.dll awalnya dibangun dengan mengacu pada unsigned versi B.dll .
Perbaikan untuk masalah ini adalah untuk menambal file IL yang dihasilkan pada langkah 1 di atas. Anda perlu menambahkan token kunci publik B.dll ke referensi. Anda mendapatkan token ini dengan menelepon
yang akan memberi Anda output berikut:
Baris terakhir berisi token kunci publik. Anda kemudian harus mencari IL dari A.dll untuk referensi ke B.dll dan menambahkan token sebagai berikut:
sumber
Perluas file proyek yang menggunakan proyek yang tidak "memiliki kunci nama yang kuat" dan cari
.snk
file (.StrongNameKey).Jelajahi file ini di Windows Explorer (hanya agar Anda tahu di mana itu).
Kembali di Visual Studio dalam proyek yang tidak "memiliki kunci nama yang kuat", lakukan
<Browse>
ke.snk
file yang Anda temukan sebelumnyaItu harus melakukan trik. Ini memecahkan masalah bagi saya untuk satu proyek menggunakan formulir di dalam proyek lain dalam solusi yang sama.
Saya harap ini membantu.
sumber
Saya sedang mencari solusi untuk masalah yang sama dan tidak mencentang opsi "Masuk majelis" berfungsi untuk saya:
(karena Anda mungkin melihat tangkapan layar berasal dari VS2010 tetapi mudah-mudahan itu akan membantu seseorang)
sumber
Saya telah menulis sebuah alat untuk secara otomatis nama majelis tanda yang kuat termasuk yang Anda tidak memiliki kode sumber untuk atau proyek yang telah ditinggalkan. Ini menggunakan banyak teknik yang dijelaskan dalam jawaban dengan cara yang sederhana tanpa kekurangan atau kekurangan alat yang ada atau instruksi tanggal.
http://brutaldev.com/post/2013/10/18/NET-Assembly-Strong-Name-Signer
Semoga ini bisa membantu siapa saja yang perlu menandatangani majelis pihak ketiga tanpa harus melewati rintangan untuk sampai ke sana.
sumber
Anda dapat menggunakan rakitan yang tidak ditandatangani jika rakitan Anda juga yang tidak ditandatangani.
sumber
Menandatangani majelis pihak ketiga berhasil untuk saya:
http://www.codeproject.com/Tips/341645/Referenced-assembly-does-not-have-a-strong-name
EDIT : Saya telah mempelajari bahwa sangat membantu untuk memposting langkah-langkah seandainya artikel yang ditautkan tidak lagi valid. Semua kredit diberikan kepada Hiren Khirsaria :
Jalankan perintah visual studio prompt dan buka direktori tempat DLL Anda berada.
For Example my DLL is located in
D:/hiren/Test.dll
Sekarang buat file IL menggunakan perintah di bawah ini.
D:/hiren> ildasm /all /out=Test.il Test.dll
(perintah ini menghasilkan pustaka kode)Hasilkan kunci baru untuk menandatangani proyek Anda.
D:/hiren> sn -k mykey.snk
Sekarang tandatangani perpustakaan Anda menggunakan
ilasm
perintah.D:/hiren> ilasm /dll /key=mykey.snk Test.il
sumber
Cara menandatangani majelis pihak ketiga yang tidak ditandatangani
sn
ildasm
danilasm
sn –k Cool.Library.snk
untuk membuat pasangan kunci baruildasm Cool.Library.dll /out:Cool.Library.il
untuk membongkar perpustakaanmove Cool.Library.dll Cool.Library.unsigned.dll
untuk menyimpan perpustakaan asli sebagai cadanganilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk
untuk merakit kembali perpustakaan dengan nama yang kuatpowershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll"
untuk mendapatkan nama majelis sepenuhnya memenuhi syarat. Anda akan memerlukan bit ini jika Anda harus merujuk DLL dalam file konfigurasi eksternal seperti web.config atau app.config.sumber
Saya memiliki masalah ini untuk aplikasi yang sangat bernama kemudian harus mengubahnya untuk referensi perakitan yang tidak bernama, jadi saya hapus centang 'Masuk perakitan' di bagian Penandatanganan properti proyek tetapi masih mengeluh. Saya pikir itu harus menjadi artefak di suatu tempat yang menyebabkan masalah karena saya melakukan segalanya dengan benar dan hanya itu. Saya menemukan dan menghapus baris: [assembly: AssemblyKeyFile ("yourkeyfilename.snk")] dari file assemblyInfo.cs. Maka tidak ada keluhan membangun setelah itu.
sumber
Saya mengalami ini dengan ServiceStack dll saya telah menginstal dengan nuget. Ternyata ada satu set dll yang tersedia yang diberi label ditandatangani. Tidak akan menjadi jawaban untuk semua orang, tetapi Anda mungkin hanya perlu memeriksa versi rakitan Anda yang sudah ditandatangani.
sumber
Bagi saya masalah saya adalah saya memiliki dua Paket NuGet yang sama diinstal dengan Versi yang berbeda.
sumber
Menghapus tanda centang "Masuk unit" di bawah "Penandatanganan" tab berfungsi seperti yang dikatakan @Michal Stefanow.
Tambahkan di sini adalah cara paling sederhana untuk menandatangani file Anda sendiri dan / atau file orang lain. Anda hanya perlu menambahkan baris ini di bawah "Baris perintah acara post-build":
Anda dapat menandatangani file orang lain atau file Anda sendiri dan sebanyak yang Anda inginkan.
sumber
Pertanyaan lama, tapi saya terkejut belum ada yang menyebutkan ilmerge. ilmerge berasal dari Microsoft, tetapi tidak dikirimkan bersama VS atau SDK. Anda dapat mengunduhnya dari sini . Ada juga repositori github . Anda juga dapat menginstal dari nuget:
Menggunakan:
Jika perlu, Anda dapat membuat keyfile Anda sendiri menggunakan sn (dari VS):
sumber
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
Situasi: Anda memiliki proyek A, B, C, D dalam solusi X, Y
Proyek A, B, C dalam X Proyek A, C, D dalam Y
Saya perlu menggunakan proyek C di proyek A, tetapi nanti saya tidak menggunakannya. Dalam proyek bin Debug A memiliki C.dll.
Jika saya mengkompilasi solusi X, semuanya baik (dalam solusi ini saya menghapus referensi A -> C.), tetapi dalam solusi YI mendapatkan masalah ini.
Solusi adalah hapus C.dll dalam proyek A bin Debug
sumber
Pertama-tama pastikan semua paket nuget berada pada versi yang sama di semua proyek dalam solusi Anda. mis. Anda tidak ingin satu proyek untuk referensi NLog 4.0.0.0 dan proyek lain untuk referensi NLog 4.1.0.0. Kemudian coba instal ulang paket nuget dengan
Update-Package -reinstall
Saya memiliki 3 majelis pihak ke-3 yang dirujuk oleh majelis A saya dan hanya 2 yang dimasukkan dalam Referensi oleh majelis B saya yang juga dirujuk A.
Referensi yang hilang untuk perakitan pihak ke-3 ditambahkan oleh perintah paket pembaruan, dan kesalahan hilang.
sumber