Mengapa saya mendapatkan 'Majelis' * .dll 'harus ditandatangani dengan kuat agar ditandai sebagai prasyarat.'?

266

Saya mencoba untuk mengkompilasi addin excel saya menggunakan C # 4.0, dan mulai mendapatkan masalah ini ketika membangun proyek saya di Visual Studio. Penting untuk memberi tahu Anda bahwa saya belum pernah mengalami masalah ini sebelumnya. Apa yang dapat menyebabkan ini terjadi?

Sergey Kucher
sumber
72
Sebagai upaya cepat, kosongkan folder bindan objfolder proyek Anda, dan bangun kembali proyek tersebut. Terkadang ini berhasil.
Jason Evans
apakah Anda menandatangani majelis?
Felice Pollano
3
@ Jason, Membersihkan proyek dan membangun kembali bekerja untuk saya. Saya baru saja menandatangani majelis dan proyek akan dibangun, tetapi tidak akan dipublikasikan.
Kratz
1
@Ratz - Senang tip ini bekerja untuk Anda :) Ini seperti memperbaiki komputer Anda dengan me-reboot-nya!
Jason Evans
Ini terjadi pada saya ketika manajer konfigurasi mereset pengaturan build pada beberapa proyek saya (yaitu mereka tidak diatur untuk membangun "Rebuild All"), setelah versi proyek-proyek tersebut dan membangun kembali kesalahan akan terjadi.
alan

Jawaban:

239

Dugaan saya adalah bahwa Anda tidak bekerja dengan majelis yang sangat bernama. Saya mengalami kesalahan ini ketika dua proyek mereferensikan versi yang sedikit berbeda dari perakitan yang sama dan proyek yang lebih tergantung merujuk pada proyek-proyek ini. Resolusi dalam kasus saya adalah untuk menghapus informasi kunci dan versi dari nama majelis di file .csproj (tidak masalah lagi), dan kemudian melakukan build bersih.

Perubahan antara versi perakitan yang berbeda kompatibel dengan bagian-bagian dari solusi yang merujuk kepada mereka. Jika tidak demikian halnya dengan Anda, Anda mungkin harus melakukan lebih banyak pekerjaan untuk menyelesaikan masalah.

NuGet

Dengan NuGet mudah untuk masuk ke situasi ini jika:

  1. Anda menginstal paket ke satu proyek dalam solusi Anda.
  2. Versi baru dari paket itu digunakan untuk sumber paket.
  3. Anda menginstalnya ke proyek lain dalam solusi yang sama.

Ini menghasilkan dua proyek dalam solusi Anda yang mereferensikan versi berbeda dari rakitan paket itu. Jika salah satu dari mereka merujuk yang lain dan merupakan aplikasi ClickOnce, Anda akan melihat masalah ini.

Untuk memperbaikinya, update-package [package name]keluarkan perintah di Nuget Package Manager Console untuk membawa semuanya ke level yang sama, di mana masalah tersebut hilang.

Anda harus mengelola paket NuGet di tingkat solusi daripada di tingkat proyek kecuali ada alasan kuat untuk tidak melakukannya. Manajemen paket tingkat solusi menghindari potensi beberapa versi dependensi. Saat menggunakan UI manajemen, jika tab Konsolidasi menunjukkan 1 atau lebih paket memiliki beberapa versi, pertimbangkan untuk mengkonsolidasikannya menjadi satu.

Kit
sumber
7
Berikut ini beberapa info lebih lanjut: social.msdn.microsoft.com/Forums/en/csharplanguage/thread/… . Juga, kliring bin dan obj dan (jika dalam kendali Anda) menetapkan versi perakitan untuk nilai yang sama (misalnya meninggalkan build angka nol) membantu.
Kit
3
Saya telah menempelkan sedikit pada akhir jawaban Anda untuk mencerminkan pengalaman saya sendiri hari ini dengan NuGet dan kesalahan yang sama ini. Semoga itu bisa membantu seseorang keluar kapan-kapan (mungkin bahkan saya sendiri dalam waktu beberapa bulan!).
Neil Barnwell
2
Kesalahan ini terus muncul untuk saya dan menghapus nama rakitan dari file .csproj, kemudian pembersihan secara konsisten memperbaikinya untuk saya. Terima kasih!
ScubaSteve
1
Anda mungkin ingin melihat jawaban ini jika jawaban di atas tidak bekerja dan Anda pikir Anda menambahkan referensi NuGet ke salah satu proyek Anda menggunakan Intellisense / ReSharper.
David Murdoch
Solusinya berisi 4 proyek. Satu proyek B adalah perpustakaan kelas. Dll B sedang direferensikan di sisa tiga. Dua lainnya proyek ( C dan D ) executable sedang dirujuk dalam A . Jadi saya membangun A dan mendapat masalah yang sama. Cara mengatasinya adalah membangun kembali sisa dua proyek terlebih dahulu. Dan kemudian membangun kembali proyek A masalah tetap.
Vikram Singh Saini
268

Ketika saya memiliki masalah ini, saya memperbaikinya dengan mematikan 'Aktifkan pengaturan keamanan ClickOnce'.

Menu: Proyek | Properti 'Nama proyek' ... | Tab keamanan | Kotak centang 'Aktifkan pengaturan keamanan ClickOnce'.

CharleZ
sumber
2
Tidak berfungsi untuk saya di VS2012 (kotak centang diperiksa ulang secara otomatis selama publikasi). Saya menggunakan jawaban ini sebagai gantinya, karena DLL diperlukan untuk proses pembuatan saja. stackoverflow.com/a/8123074/17713
Matthias Meid
3
Saat menggunakan ClickOnce, kotak centang ini dipilih secara otomatis setiap kali aplikasi diterbitkan dengan terbitan pemandu. Lihat msdn.microsoft.com/en-us/library/1sfbfyk0.aspx untuk informasi lebih lanjut.
David Murdoch
8
Saya memiliki MSVS 2015 dan saya tidak melihat tab keamanan di bawah properti proyek
zeta
70

Lihat jawaban ini .

Buka halaman terbitkan dan klik "File Aplikasi". Dari sana Anda akan melihat daftar DLL Anda. Pastikan bahwa orang-orang yang membuat Anda kesulitan memiliki Status Publikasi mereka ditandai sebagai "Sertakan" daripada "Prasyarat".

Otiel
sumber
2
Proyek addel exel tidak memiliki tombol File Aplikasi. stackoverflow.com/questions/6378801/…
Sergey Kucher
@SergeyKucher: Saya tidak tahu itu. Terima kasih atas pembaruannya. Karena pertanyaan Anda tidak tepat untuk addin Excel, saya pikir jawaban saya masih valid di sini (saya memiliki pesan kesalahan yang sama pada proyek winforms dan menyelesaikannya dengan cara ini).
Otiel
Saya memiliki proyek winforms yang dibangun dengan baik sampai saya menggunakan wisaya mempublikasikan setelah itu saya mendapatkan kesalahan OP. Mengubah status publikasi memperbaiki masalah. Terima kasih
Kristian
7
Dalam kasus saya, masalah ini diselesaikan dengan mengubah Status Publikasikan dari INCLUDE (otomatis) menjadi INCLUDE saja. Bagaimanapun, jawaban Anda membantu untuk tidak menekankan pada nilai yang ditunjukkan. Terima kasih banyak
Julio Nobre
22

Saya punya masalah ini. Itu terjadi karena saya punya banyak proyek yang menunjuk ke perakitan yang sama tetapi dari versi yang berbeda. Saya menyelesaikannya dengan memilih versi yang sama untuk semua proyek dalam solusi saya.

daniel
sumber
13

Jika Anda telah mengubah versi perakitan atau menyalin versi berbeda dari perpustakaan terkelola yang dinyatakan dalam kesalahan, Anda mungkin juga telah mengompilasi file yang merujuk ke versi yang salah. A 'Rebuild All' (atau menghapus Anda 'bin dan' obj 'folder seperti yang disebutkan dalam komentar sebelumnya) harus memperbaiki kasus ini.

Sogger
sumber
1
Atau hanya 'Solusi Bersih'
Tanpa Izin
A 'Rebuild All' melakukan clean dulu, dan sama dengan 'clean' lalu 'build'. Yang baik untuk dicatat adalah bahwa kadang-kadang ketika file telah disalin secara manual atau disalin dengan cap waktu yang berbeda, fungsi 'bersih' / 'bangun kembali' tidak memperbaiki masalah dan diperlukan untuk menghapus secara manual folder 'bin' dan 'obj'.
Sogger
Untuk masalah ini terkait dengan Excel, menghapus folder bin / obj bekerja untuk saya, pendekatan lain tidak.
William Melani
6

Anda harus menandatangani rakitan dengan kunci. Buka properti proyek di bawah penandatanganan tab: masukkan deskripsi gambar di sini

Felice Pollano
sumber
6

Menambahkan solusi saya untuk masalah ini bagi siapa saja yang mungkin bisa membantu.

Saya punya solusi ClickOnce melempar kesalahan ini. Aplikasi mereferensikan folder "Libs" yang umum dan berisi referensi proyek ke a Foo.dll. Sementara tidak ada proyek dalam solusi yang mereferensikan salinan statis dari Foo.dllfolder "Libs", beberapa referensi dalam folder itu melakukan (yaitu: solusi saya memiliki Libs\Bar.dllreferensi yang dirujuk Foo.dll.) Karena aplikasi CO menarik semua dependensi dari Libsserta ketergantungan mereka, kedua salinan masuk ke proyek. Ini menghasilkan kesalahan di atas.

Saya memperbaiki masalah dengan memindahkan Libs\Foo.dllversi statis saya ke subfolder Libs\Fix\Foo.dll,. Perubahan ini membuat aplikasi ClickOnce hanya menggunakan versi proyek DLL dan kesalahannya hilang.

Nick Gotch
sumber
6

Menghapus DLL (di mana kesalahan terjadi) dan membangun kembali solusi memperbaiki masalah saya. Terima kasih

Kishore
sumber
6

Jika Anda mencoba semua jawaban lain dalam pertanyaan ini dan Anda:

  • Miliki banyak proyek dalam solusi Anda
  • Memiliki proyek (Proyek A) yang mereferensikan proyek lain (Proyek B), yang proyeknya merujuk paket NuGet.
  • Di Proyek A, Anda menggunakan Intellisense / ReSharper untuk membawa referensi ke paket NuGet yang dirujuk dalam Proyek B (ini bisa terjadi ketika metode dalam Proyek B mengembalikan jenis yang disediakan oleh paket NuGet dan metode yang digunakan dalam Proyek A)
  • memperbarui paket NuGet melalui NuGet Package Manager (atau CLI).

... Anda mungkin memiliki versi terpisah dari paket NuGet DLL dalam Referensi proyek Anda, karena referensi yang dibuat oleh Intellisense / ReSharper akan menjadi referensi "normal", dan bukan referensi NuGet seperti yang diharapkan, sehingga proses pembaruan NuGet memenangkan ' t temukan atau perbarui!

Untuk memperbaikinya, hapus referensi di Project A, lalu gunakan NuGet untuk menginstalnya, dan pastikan paket NuGet di semua proyek adalah versi yang sama. (seperti yang dijelaskan dalam jawaban ini )


Tip Hidup Pro:

Masalah ini dapat muncul setiap kali ReSharper / Intellisense menyarankan untuk menambahkan referensi ke proyek Anda. Ini bisa jauh lebih berbelit-belit daripada contoh di atas, dengan banyak proyek dan ketergantungan yang saling terkait membuatnya sulit dilacak. Jika referensi yang disarankan oleh ReSharper / Intellisense sebenarnya dari paket NuGet, gunakan NuGet untuk menginstalnya.

David Murdoch
sumber
Ya, hindari menggunakan Resharper untuk menambahkan referensi. Resharper akan mengambil dll referensi dari folder debug (atau lepaskan jika Anda dalam mode rilis). Itu akan menyebabkan banyak masalah, khususnya dalam proyek-proyek besar.
cepriego
5

Ketika ini terjadi pada saya dengan WindowsAPICodePack setelah saya memperbaruinya, saya baru saja membangun kembali solusinya.

Build -> Rebuild Solution

Nathan
sumber
4

Ada terlalu banyak proyek dalam solusi saya untuk dilalui dan diperbarui secara individual sehingga saya memperbaikinya dengan:

  • Klik kanan solusi saya dan pilih 'Kelola Paket NuGet untuk Solusi ...'
  • Pergi ke tab Pembaruan
  • Menemukan paket yang terpengaruh dan memilih Perbarui
  • Mengklik OK dan ini membuat semua contoh paket up to date
RagtimeWilly
sumber
4

Membongkar dan memuat ulang proyek masalah menyelesaikannya untuk saya.

ChrisO
sumber
4

Saya pergi untuk mempublikasikan , file aplikasi, menemukan dll melemparkan kesalahan mengubahnya menjadi 'Sertakan' dari 'Sertakan (Otomatis)'. Saya sekarang bisa menerbitkan.

Jimmy
sumber
4

Saya mengalami masalah ini setelah melakukan migrasi Addin Excel dari paket.config ke PackageReference. Tampaknya terkait dengan masalah ini .

Berikut ini berfungsi sebagai solusi kasar jika Anda tidak menggunakan ClickOnce (itu akan menghilangkan semua informasi ketergantungan dari .manifestfile):

  1. Bongkar proyek, edit .csproj
  2. Temukan bagian yang terlihat seperti ini:

    <!-- Include additional build rules for an Office application add-in. -->
    <Import Project="$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets" Condition="'$(VSToolsPath)' != ''" />
  3. Edit salinan yang diubah namanya dari .targetsfile yang direferensikan (dalam kasus saya, file tersebut diselesaikan C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\OfficeTools\Microsoft.VisualStudio.Tools.Office.targetsdan saya membuat salinan Microsoft.VisualStudio.Tools.Office_FIX.targetsdi folder yang sama - tidak memeriksa apakah itu berfungsi dari folder yang berbeda).

  4. Temukan GenerateApplicationManifestelemen dan ubah atributnya Dependencies="@(DependenciesForGam)"menjadi Dependencies="".

  5. Ubah bagian yang ditemukan pada 2. sebagai rujukan .targetsfile yang diedit .

Ini harus diulang setiap kali versi .targetsfile yang dikirimkan dengan VS diperbarui (atau Anda tidak akan mendapatkan pembaruan), tetapi saya berharap ini akan segera diperbaiki ...

FunctorSalad
sumber
2
Untuk menambahkan ini, cara yang sedikit lebih lembut untuk memperbaiki masalah ini adalah dengan menyalin seluruh bagian <Target Name = "VisualStudioForApplicationsBuild"> dari file yang terletak di titik 3 (yaitu: hanya menemukan file, jangan salin dan ganti nama itu) , ke file proj proyek Anda sendiri. **, dan buat perubahan yang sama seperti yang dijelaskan pada poin 4. Ini akan menimpa perilaku hanya untuk proyek Anda, dan tidak akan mempengaruhi hal lain pada mesin Anda. Jika ada perubahan pada file asli dalam pembaruan VS di masa depan, Anda mungkin masih perlu mengulangi prosesnya.
Adam
3

Apakah perakitan Anda ditandatangani dengan benar?

Untuk memeriksanya, tekan Alt + Enter pada proyek Anda (atau klik kanan, lalu Properties). Pergi ke "Masuk". Verifikasi bahwa kotak centang "Masuk majelis" dicentang dan file kunci nama yang kuat dipilih dan "Hanya tunda tanda" tidak dicentang .

Arseni Mourzenko
sumber
Saya belum menandatangani * .dll, tetapi tidak ada masalah dengan itu sebelumnya (saya tidak memiliki kesalahan kompilasi sebelumnya). Dll direferensikan dalam salah satu proyek referensi dari yang diterbitkan, saya menemukan solusi jelek untuk referensi dll langsung dari proyek yang diterbitkan, dapatkah Anda memberi tahu saya mengapa itu bekerja sekarang? Atau bagaimana saya bisa memecahkan proble dengan cara opther? Terima kasih
Sergey Kucher
1
@ user520535: well, jika Anda belum menandatangani perpustakaan sebelumnya, Anda harus. Ini bukan satu-satunya cara bagi perpustakaan ini untuk dapat digunakan oleh majelis yang ditandatangani (majelis yang ditandatangani tidak dapat memanggil yang tidak ditandatangani), tetapi bekerja dengan majelis yang tidak ditandatangani juga sangat rumit ketika Anda berurusan dengan plug-in / add -di dalam. Sekarang, mengapa itu mulai menimbulkan masalah sekarang dan bukan sebelumnya? Saya tidak tahu.
Arseni Mourzenko
@ user520535: jika itu membantu, Anda bebas untuk menerima atau membatalkan jawaban.
Arseni Mourzenko
3

Sekarang, ini adalah pendekatan yang berbeda untuk masalah tersebut:

  • Klik kanan pada proyek dan pilih opsi 'Bongkar Proyek'. Anda akan melihat bahwa proyek Anda menjadi tidak tersedia.

  • Klik kanan pada proyek yang tidak tersedia dan pilih opsi 'Edit'.

  • Gulir ke bawah ke tag '<ItemGroup>' yang berisi semua tag sumber daya.

  • Sekarang buka referensi yang telah ditampilkan pada daftar kesalahan, Anda akan melihat itu menggunakan satu tag (yaitu < Reference Include="assemble_name_here, Version=0.0.0.0, Culture=neutral" / >).

  • Ubah itu menjadi seperti berikut:

.

<Reference Include="assemble_name_here, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL" >
    < Private > True < / Private >
    < HintPath > path_here\assemble_name_here.dll < / HintPath >
< / Reference >
  • Simpan perubahan Anda, Klik kanan pada proyek yang tidak tersedia lagi dan klik pada opsi 'Muat Ulang Proyek', lalu buat.
Tech
sumber
3

Ini disebabkan ketika Anda mengubah versi .dll yang direferensikan. Anda perlu menghapus semua item, atau .dll di folder build target.

Hoang Ha
sumber
2

Saya mendapat kesalahan kompilator serupa. Setelah saya menambahkan proyek dependen dari file dll ke solusinya, masalah terselesaikan.

Minny
sumber
2

Jika proyek utama Anda menggunakan beberapa proyek perpustakaan dan memiliki referensi untuk mereka, Anda dapat menyebabkan masalah ini jika proyek Anda merujuk ke file dll perakitan bukan ke proyek perpustakaan ketika Anda mengubah sesuatu di proyek perpustakaan Anda (mis: ganti nama kelas).

Anda dapat memeriksa semua referensi untuk proyek utama Anda dengan melihat di jendela Object Browser (menu View-> Object Browser). Referensi ke file dll selalu memiliki nomor versi. Mis: TestLib [1.0.0.0]

Solusi: hapus referensi saat ini dari proyek utama Anda ke proyek perpustakaan dan tambahkan referensi ke proyek perpustakaan itu lagi.

Huy Nguyen
sumber
1

Setelah mencoba sebagian besar solusi di sini, saya akhirnya hanya menambahkan referensi ke proyek dari klik sekali proyek, ini mengubahnya menjadi Sertakan (Otomatis) dari Sertakan dan akhirnya berhasil.

PatFromCanada
sumber
1

Apa yang membantu saya adalah saya pergi ke Package Manager Solution dan melihat paket yang diinstal yang menyebabkan masalah. Saya melihat bahwa beberapa proyek merujuk paket yang sama tetapi versi yang berbeda. Saya menyelaraskannya berdasarkan kebutuhan saya dan itu berhasil.

Artexias
sumber
0

Saya punya ini dalam solusi w / 6 proyek. Salah satu proyek saya merujuk ke majelis bernama sebagai referensi file. Yang lain menunjuk ke referensi proyek.

Saya biasanya mendapatkan kesalahan berbeda dalam kasus ini.

Solusi saya adalah menghapus majelis bernama di mana saja itu direferensikan dan tambahkan kembali. Setelah saya mengerjakan proyek, masalah menghilang. Sebelum melakukan ini, saya mencoba membersihkan solusi serta memastikan tidak ada proyek yang ditandatangani.

semoga membantu seseorang ...

greg
sumber
0

Jika ini merupakan ketidakcocokan dari dependensi dependensi, pergi ke manajer paket NuGet di tingkat solusi dan periksa tab Perbarui dan Konsolidasi, selaraskan semuanya.

Luke Puplett
sumber
0

Saya baru-baru ini mengalami masalah ini. Dalam kasus saya, saya memiliki paket NuGet di majelis yang berbeda. Apa yang saya miliki adalah versi berbeda dari paket NuGet yang sama yang dikaitkan dengan majelis saya sendiri.
Solusi saya adalah menggunakan manajer paket NuGet pada Solusi, sebagai lawan dari proyek individu. Ini memungkinkan opsi "konsolidasi", di mana Anda dapat memutakhirkan paket NuGet Anda di banyak proyek yang Anda inginkan - sehingga semuanya merujuk ke versi yang sama dari perakitan. Ketika saya melakukan konsolidasi, kegagalan build hilang.

Simon Miller
sumber
0

Saya juga menemukan masalah, yang harus saya lakukan hanyalah menghapus .dll (dapat ditemukan dalam referensi) yang menyebabkan kesalahan dan menambahkannya lagi .

Bekerja seperti pesona.

FritsJ
sumber
0

Coba dengan pembaruan-paket-instal-dependensi

Stella Oliveira
sumber
0

Cukup buka Publikasikan -> File Aplikasi -> Dan ubah status publikasi dll yang terpengaruh dari prasyarat untuk menyertakan! Ini berhasil untuk saya!

SWIK
sumber