Neden önkoşul olarak işaretlenebilmek için 'Assembly' * .dll 'imzalı olmalıdır.?


266

C # 4.0 kullanarak excel eklenti derlemeye çalışıyorum ve Visual Studio projemi oluştururken bu sorunu almaya başladı. Bu sorunu daha önce yaşamadığımı söylemek önemli. Bunun olmasına ne neden olabilir?


72
Hızlı bir denemede olarak, hem temizlemek binve objprojenizin klasörleri ve yine projeyi oluşturun. Bazen bu işe yarar.
Jason Evans

Meclisi imzaladın mı?
Felice Pollano

3
@ Jason, projeyi temizlemek ve yeniden inşa etmek benim için çalıştı. Yakın zamanda meclisleri imzalamıştım ve proje inşa edilecek, ancak yayınlamayacaktı.
Kratz

1
@Kratz - Bu ipucu sizin için çalıştı sevindim :) Biraz yeniden başlatarak bilgisayarınızı düzeltmek gibi!
Jason Evans

Bu, yapılandırma yöneticisi birkaç projemdeki (yani "Tümünü Yeniden Oluştur" üzerine kurulmaya ayarlanmadı) oluşturma ayarlarını sıfırladığında, bu projeleri sürümlendirdikten ve hatayı yeniden oluşturduktan sonra başıma geldi.
alan

Yanıtlar:


239

Benim tahminim, güçlü bir şekilde adlandırılmış meclislerle çalışmamanız. İki proje aynı derlemenin biraz farklı sürümlerine ve daha bağımlı bir proje bu projelere başvurduğunda bu hatayla karşılaştım. Benim durumumda çözüm anahtar ve sürüm bilgilerini .csproj dosyalarında derleme adından kaldırmak (yine de önemli değildi) ve sonra temiz bir yapı yapmak oldu.

Farklı montaj versiyonları arasındaki değişiklikler, çözümün bunlara atıfta bulunan kısımlarıyla uyumluydu. Bu durum sizin için uygun değilse, sorunu çözmek için biraz daha çalışmanız gerekebilir.

Nuget

NuGet ile şu durumlarda bu duruma girmek kolaydır:

  1. Çözümünüzdeki bir projeye bir paket yüklersiniz.
  2. Bu paketin yeni bir sürümü paket kaynağına dağıtılır.
  3. Aynı çözümde başka bir projeye yüklersiniz.

Bu, çözümünüzde o paketin derlemelerinin farklı sürümlerine başvuruda bulunan iki projeyle sonuçlanır. Bunlardan biri diğerine başvuruyorsa ve bir ClickOnce uygulamasıysa, bu sorunu görürsünüz.

Bunu düzeltmek update-package [package name]için, Nuget Paket Yöneticisi Konsolu'nda her şeyi düz bir oyun alanına getirme komutunu verin, bu noktada problem ortadan kalkar.

Zorlayıcı bir neden olmadığı sürece NuGet paketlerini proje düzeyinde değil çözüm düzeyinde yönetmelisiniz. Çözüm düzeyinde paket yönetimi, bağımlılıkların çoklu sürümlerinin potansiyelini önler. Yönetim kullanıcı arayüzünü kullanırken, Birleştirilmiş sekmesinde 1 veya daha fazla paketin birden fazla sürümü varsa, bunları birle birleştirmeyi düşünün.


7
İşte biraz daha bilgi: social.msdn.microsoft.com/Forums/en/csharplanguage/thread/… . Ayrıca, bin ve obj'leri temizlemek ve (kontrolünüzdeyse) montaj versiyonunu aynı değere ayarlamak (örn. Yapı numarasını sıfır bırakmak) yardımcı olur.
Kit

3
Bugün NuGet'teki kendi deneyimimi ve aynı hatayı yansıtmak için cevabınızın sonuna biraz takıldım. Umarım birisine yardım eder (muhtemelen birkaç ay içinde kendim bile!).
Neil Barnwell

2
Bu hata benim için açılmaya ve derleme adını .csproj dosyasından kaldırmaya devam ediyor, sonra temizlik benim için sürekli olarak düzeltildi. Teşekkürler!
ScubaSteve

1
Yukarıdaki yanıt işe yaramadıysa ve Intellisense / ReSharper kullanarak projelerinizden birine NuGet referansını eklediğinizi düşünüyorsanız bu yanıtı görmek isteyebilirsiniz .
David Murdoch

Çözüm 4 proje içeriyor. Bir proje B sınıf kütüphanesidir. B'nin dll üç geri kalanı referans oldu. Diğer iki projenin ( ve D başvurulan yürütülebilir) A . Bu yüzden A'yı inşa ettim ve aynı sorunu aldım. Düzeltme ilk iki projenin geri kalanını yeniden inşa etmekti. Ve sonra proje yeniden bir sorunun çözümünü.
Vikram Singh Saini

268

Bu sorunu yaşadığımda, 'ClickOnce güvenlik ayarlarını etkinleştir' seçeneğini kapatarak çözdüm.

Menü: Proje | 'Proje adı' Özellikler ... | Güvenlik sekmesi | 'ClickOnce güvenlik ayarlarını etkinleştir' onay kutusu.


2
VS2012'de benim için çalışmadı (yayın sırasında onay kutusu otomatik olarak yeniden kontrol edilir). DLL yalnızca oluşturma işlemi için gerekli olduğu için bunun yerine bu yanıtı kullandım. stackoverflow.com/a/8123074/17713
Matthias Meid

3
ClickOnce kullanırken, uygulama Yayınlama sihirbazıyla her yayınlandığında bu onay kutusu otomatik olarak seçilir. Daha fazla bilgi için msdn.microsoft.com/en-us/library/1sfbfyk0.aspx adresine bakın .
David Murdoch

8
MSVS 2015'im var ve proje özellikleri altındaki güvenlik sekmesini görmüyorum
zeta

70

Bu cevaba bakınız .

Yayınlama sayfasına gidin ve "Uygulama Dosyaları" nı tıklayın. Buradan DLL'lerinizin bir listesini görmelisiniz. Sorun çıkaranların Yayın Durumlarının "Önkoşul" yerine "İçer" olarak işaretlendiğinden emin olun.


2
Exel addin projesinde Uygulama Dosyaları düğmesi yoktur. stackoverflow.com/questions/6378801/…
Sergey Kucher

@SergeyKucher: Bunu bilmiyordum. Güncelleme için teşekkürler. Sorunuz bir Excel eklentisi için kesin olmadığından, cevabım burada hala geçerli (sanırım bir winforms projesinde aynı hata mesajına sahiptim ve bu şekilde çözdüm ).
Otiel

Yayınlama sihirbazını kullanana kadar iyi inşa edilmiş bir winforms projem var, daha sonra OP hatalarını aldım. Yayınlama durumunu değiştirmek sorunu çözdü. Teşekkürler
Kristian

7
Benim durumumda, bu sorun Yayınlama Durumunu INCLUDE (otomatik) yerine sadece INCLUDE olarak değiştirerek çözüldü. Her neyse, cevabınız gösterilen değerlere baskı yapmamaya yardımcı oldu. Çok teşekkürler
Julio Nobre

22

Bu sorunu yaşadım. Aynı meclise ama farklı versiyonlara işaret eden birçok projem olduğu için oldu. Çözümümdeki tüm projelere aynı sürümü seçerek çözüyorum.


13

Derleme sürümünüzü değiştirdiyseniz veya yönetilen kitaplığın hatada belirtilen farklı bir sürümünü kopyaladıysanız, daha önce yanlış sürüme başvuruda bulunan dosyaları derlemiş olabilirsiniz. Bir 'Tümünü Yeniden Oluştur' (veya önceki yorumda belirtildiği gibi 'bin ve' obj 'klasörlerinizi silmeniz) bu durumu düzeltmelidir.


1
Veya sadece 'Temiz Çözüm'
17'de

Bir 'Tümünü Yeniden Oluştur' önce temiz bir performans gösterir ve önce 'temiz' sonra 'derlemeye' eşdeğerdir. Bununla birlikte, bazen dosyalar farklı zaman damgalarıyla manuel olarak kopyalandığında veya kopyalandığında, 'temiz' / 'yeniden oluşturma' işlevselliğinin sorunu çözmediği ve 'bin' ve 'obj' klasörlerinin manuel olarak silinmesi gerektiğidir.
Sogger

Excel ile ilgili bu konuda, bin / obj klasörlerini silmek benim için çalıştı, diğer yaklaşımlar işe yaramadı.
William Melani

6

montajı bir anahtarla imzalamanız gerekir. Sekme imzasının altındaki proje özelliklerine gidin: resim açıklamasını buraya girin


6

Yardımcı olabileceği herkes için bu soruna yönelik çözümümü eklemek.

Bu hatayı atan bir ClickOnce çözümü vardı. Uygulama ortak bir "Libs" klasörüne atıfta bulundu ve a Foo.dll. Çözümdeki projelerden hiçbiri Foo.dll"Libs" klasöründeki statik kopyaya başvurmazken, bu klasördeki bazı referanslar (yani: çözümümün referans Libs\Bar.dllaldığı referanslar vardı Foo.dll). CO uygulaması tüm bağımlılıklarıLibs her iki kopya da projeye giriyordu. Bu, yukarıdaki hatayı oluşturuyordu.

Libs\Foo.dllStatik versiyonumu bir alt klasöre taşıyarak sorunu çözdüm Libs\Fix\Foo.dll. Bu değişiklik, ClickOnce uygulamasının yalnızca DLL dosyasının proje sürümünü kullanmasını sağladı ve hata kayboldu.



6

Bu sorudaki diğer tüm cevapları denediyseniz ve siz:

  • Çözümünüzde birden fazla proje var
  • Projesi NuGet paketine başvuran başka bir projeye (Proje B) başvuran bir projeniz (Proje A) var.
  • Proje A'da, Proje B'de başvurulan NuGet paketine başvuruyu getirmek için Intellisense / ReSharper'ı kullandınız (Proje B'deki bir yöntem NuGet paketi tarafından sağlanan bir tür döndürdüğünde ve bu yöntem Proje A'da kullanıldığında olabilir)
  • NuGet paketini NuGet Paket Yöneticisi (veya CLI) aracılığıyla güncelledi.

... Intellisense / ReSharper tarafından oluşturulan referans bir "normal" referans olacak ve beklendiği gibi bir NuGet referansı olmayacağı için NuGet paketleri DLL'inin projelerinizin Referanslarında ayrı sürümleri olabilir. t bulmak veya güncellemek!

Bunu düzeltmek için Project A'daki başvuruyu kaldırın, ardından yüklemek için NuGet'i kullanın ve tüm projelerde NuGet paketlerinin aynı sürüm olduğundan emin olun. ( bu cevapta açıklandığı gibi )


Life Pro İpucu:

Bu sorun ReSharper / Intellisense projenize bir referans eklemeyi önerdiğinde ortaya çıkabilir. Birden fazla iç içe geçme projesi ve bağımlılığı izlemeyi zorlaştıran yukarıdaki örnekten çok daha derinden kıvrık olabilir. ReSharper / Intellisense tarafından önerilen başvuru aslında bir NuGet paketindeyse, yüklemek için NuGet kullanın.


Evet, referans eklemek için Yeniden Paylaşıcı kullanmaktan kaçının. Resharper, başvuru dll'sini hata ayıklama (veya sürüm modundaysanız serbest bırakma) klasöründen alacaktır. Bu, özellikle büyük projelerde birçok soruna neden olacaktır.
cepriego

5

Bunu güncelledikten sonra WindowsAPICodePack ile başıma geldiğinde, çözümü yeniden oluşturdum.

Derleme -> Yeniden Oluşturma Çözümü


4

Çözümümde geçip bireysel olarak güncellenecek çok fazla proje vardı, bu yüzden bunu şu şekilde çözdüm:

  • Çözümümü sağ tıklayıp 'Çözüm için NuGet Paketlerini Yönet ...' seçeneğini seçin.
  • Güncellemeler sekmesine gitmek
  • Etkilenen paketi bulma ve Güncelleme'yi seçme
  • Tamam'ı tıkladığınızda bu, paketin tüm örneklerini güncel hale getirdi

4

Sorunlu projenin boşaltılması ve yeniden yüklenmesi benim için çözdü.


4

Gittiğim yayımlamak , uygulama dosyalarını hatası atma dll olarak değiştirdim bulundu 'içer' dan '(Auto) dahil et'. Şimdi yayınlayabilirim.


4

Bir Excel eklentisini Packages.config dosyasından PackageReference öğesine taşıdıktan sonra bu sorunla karşılaştım. Bu konuyla ilgili görünüyor .

Aşağıdaki, ClickOnce kullanmıyorsanız kaba bir geçici çözüm olarak çalışır ( .manifestdosyadan tüm bağımlılık bilgilerini atlar ):

  1. Projeyi kaldır, .csproj dosyasını düzenle
  2. Şuna benzeyen bölümü bulun:

    <!-- Include additional build rules for an Office application add-in. -->
    <Import Project="$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets" Condition="'$(VSToolsPath)' != ''" />
  3. Başvurulan .targetsdosyanın yeniden adlandırılmış bir kopyasını düzenleyin (benim durumumda, dosya çözüldü C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\OfficeTools\Microsoft.VisualStudio.Tools.Office.targetsve Microsoft.VisualStudio.Tools.Office_FIX.targetsaynı klasörde bir kopya oluşturdum - farklı bir klasörden çalışıp çalışmadığını kontrol etmedi).

  4. GenerateApplicationManifestÖğeyi bulun ve özelliğini Dependencies="@(DependenciesForGam)"değiştirin Dependencies="".

  5. .targetsBunun yerine düzenlenen dosyaya başvurmak için 2. bölümünde bulunan bölümü değiştirin .

.targetsVS ile birlikte gelen dosyanın sürümü güncellendiğinde (veya güncellemeleri alamayacağınız zaman) bu tekrarlanmalıdır , ancak yakında düzeltileceğini umuyorum ...


2
Buna eklemek için, sorunu düzeltmenin biraz daha yumuşak bir yolu, tüm <Hedef Adı = "VisualStudioForApplicationsBuild"> bölümünü 3. noktada bulunan dosyadan kopyalamaktır (yani: dosyayı bulun, kopyalamayın ve yeniden adlandırmayın) , kendi projenizin. ** proj dosyasına ekleyin ve 4. adımda açıklananla aynı değişikliği yapın. Bu işlem, yalnızca projeniz için davranışı geçersiz kılar ve makinenizdeki hiçbir şeyi etkilemez. Gelecekteki bir VS güncellemesinde orijinal dosyada değişiklikler varsa, yine de işlemi tekrarlamanız gerekebilir.
Adam

3

Derlemeniz düzgün imzalanmış mı?

Bunu kontrol etmek için projenizde Alt + Enter tuşlarına basın (veya sağ tıklayın, ardından Özellikler). "İmzalama" ya gidin. "Montajı imzala" onay kutusunun işaretli olduğunu ve güçlü ad anahtarı dosyasının seçili olduğunu ve "Yalnızca gecikme işareti" seçeneğinin işaretini kaldırın .


* .Dll imzalı sığınak, ama daha önce onunla hiçbir sorun yoktu (daha önce derleme hatası yoktu). Dll yayınlanan bir başvurulan projelerinden birinde başvurulan, doğrudan yayınlanan projeden dll başvuru çirkin bir çözüm buldum, lütfen bana neden şimdi çalıştığını söyleyebilir misiniz? Ya da probu nasıl başka bir şekilde çözebilirim? Teşekkür ederim
Sergey Kucher

1
@ user520535: kütüphaneyi daha önce imzalamadıysanız, yapmanız gerekir. Bu kütüphanenin imzalı meclisler tarafından kullanılabilmesinin tek yolu değildir (imzalı bir meclis imzalı olmayan birini arayamaz), ancak eklentiler / ekleme ile uğraşırken imzalı olmayan meclislerle çalışmak da çok zordur. -eklentileri. Şimdi, neden daha önce değil şimdi sorun yaratmaya başladı? Hiçbir fikrim yok.
Arseni Mourzenko

@ user520535: yardımcı olduysa, yanıtı kabul etmek veya onaylamakta serbestsiniz.
Arseni Mourzenko

3

Şimdi soruna farklı bir yaklaşım var:

  • Projeye sağ tıklayın ve 'Projeyi Kaldır' seçeneğini seçin. Projenizin kullanılamaz hale geldiğini fark edeceksiniz.

  • Kullanılamayan projeye sağ tıklayın ve 'Düzenle' seçeneğini seçin.

  • Tüm kaynak etiketlerini içeren '<ItemGroup>' etiketine gidin.

  • Şimdi hata listesinde görüntülenen referansa gidin, bunun tek bir etiket (yani < Reference Include="assemble_name_here, Version=0.0.0.0, Culture=neutral" / >) kullandığını göreceksiniz .

  • Bunu aşağıdaki gibi görünecek şekilde değiştirin:

.

<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 >
  • Değişikliklerinizi kaydedin, Kullanılamayan projeye tekrar sağ tıklayın ve 'Projeyi Yeniden Yükle' seçeneğine tıklayın, ardından derleyin.

3

Bu başvurulan .dll sürümünü değiştirdiğinizde oluşur. Hedef oluşturma klasöründeki tüm öğeleri veya .dll dosyasını silmeniz gerekir.


2

Benzer derleyici hatası aldım. Çözüme dll dosyasının bağımlı projesini ekledikten sonra sorun çözüldü.


2

Ana projeniz bazı kütüphane projelerini kullanarak ve bunlara referans varsa, kütüphane projenizde bir şey değiştirdiğinizde proje örneğiniz kitaplık projesi yerine bir derleme dll dosyasına başvuruyorsanız, bu soruna neden olabilir (örn: bir sınıfı yeniden adlandırın).

Ana projenizle ilgili tüm referansları Nesne Tarayıcısı penceresinde (Görünüm-> Nesne Tarayıcısı) görüntüleyebilirsiniz. Bir dll dosyasına yapılan başvurunun her zaman bir sürüm numarası vardır. Örn: TestLib [1.0.0.0]

Çözüm: Ana projenizin kitaplık projesine geçerli başvurusunu silin ve o kitaplık projesine yeniden başvuru ekleyin.


1

Buradaki çözümlerin çoğunu denedikten sonra, nihayet bir kez tıklama projesinden projeye bir referans ekledim, bu onu Include'dan Include (Auto) olarak değiştirdi ve sonunda çalıştı.


1

Bana yardımcı olan şey Paket Yöneticisi Çözümü'ne gittim ve soruna neden olan yüklü pakete baktım. Birkaç projenin aynı pakete ancak farklı versiyonlara referans verdiğini gördüm. Onları ihtiyaçlarıma göre hizaladım ve işe yaradı.


0

Bunu 6 projeli bir çözümde yaşadım. Projelerimden biri, adı geçen derlemeye dosya başvurusu olarak başvuruyordu. Diğerleri proje referansını işaret ediyordu.

Bu durumlarda genellikle farklı bir hata alıyorum.

Benim çözümüm, adlandırılan derleme başvurulan herhangi bir yerde silmek ve geri eklemek oldu. Bir kez proje üzerinde çalıştım, bu sorun ortadan kayboldu. Bunu yapmadan önce, çözümü temizlemeyi ve hiçbir projenin imzalanmadığından emin olmayı denedim.

umarım birine yardım eder ...


0

Bir bağımlılık bağımlılıkları uyuşmazlığı durumunda, çözüm düzeyinde NuGet paket yöneticisine gidin ve Güncelle ve Birleştir sekmelerini kontrol edin, hepsini uyumlu hale getirin.


0

Son zamanlarda bu soruna çarptım. Benim durumumda, farklı montajlarda NuGet paketlerim var. Sahip olduğum şey kendi montajlarımla ilişkili aynı NuGet paketlerinin farklı versiyonlarıydı.
Benim çözümüm, tek tek projelerin aksine, Çözüm üzerine NuGet paket yöneticisini kullanmaktı. Bu, NuGet paketlerinizi istediğiniz kadar projeye yükseltebileceğiniz bir "konsolidasyon" seçeneğini etkinleştirir - böylece hepsi montajın aynı sürümüne referans verir. Konsolidasyonları yaptığımda derleme hatası kayboldu.


0

Ben de sorunun türüne çarpmak, tüm yapmam gereken, hataya neden olan .dll (referansta bulunabilir) silmek ve tekrar eklemek .

Tıkır tıkır çalışıyor.



0

Sadece Yayınla -> Uygulama Dosyası -> gidin ve dahil etmek için önkoşuldan etkilenen dll yayın durumunu değiştirin! Bu benim için çalıştı!

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.