Dlaczego dostaję „Assembly” * .dll ”musi być silnie podpisany, aby mógł zostać oznaczony jako warunek wstępny.”?

266

Próbuję skompilować mój dodatek Excel przy użyciu C # 4.0 i zacząłem dostawać ten problem podczas budowania mojego projektu w Visual Studio. Ważne jest, aby powiedzieć, że wcześniej nie miałem tego problemu. Co może tak się stać?

Sergey Kucher
źródło
72
Jako szybką próbę wyczyść zarówno foldery , jak bini objswój projekt, i ponownie zbuduj projekt. Czasami to działa.
Jason Evans
podpisujesz zgromadzenie?
Felice Pollano
3
@Jason, Czyszczenie projektu i przebudowa działały dla mnie. Niedawno podpisałem zespoły i projekt będzie budowany, ale nie będzie publikowany.
Kratz
1
@Kratz - Cieszę się, że ta wskazówka działała dla Ciebie :) To trochę jak naprawianie komputera przez ponowne uruchomienie!
Jason Evans,
Zdarzyło mi się to, gdy menedżer konfiguracji zresetował ustawienia kompilacji w kilku moich projektach (tj. Nie zostały one ustawione na kompilację „Przebuduj wszystko”), po wersji tych projektów i przebudowaniu wystąpiłby błąd.
alan

Odpowiedzi:

239

Domyślam się, że nie pracujesz z silnie nazwanymi zestawami. Wystąpił ten błąd, gdy dwa projekty odnoszą się do nieco różnych wersji tego samego zestawu, a projekt bardziej zależny odnosi się do tych projektów. Rozwiązaniem w moim przypadku było usunięcie klucza i informacji o wersji z nazwy zestawu w plikach .csproj (i tak nie miało to znaczenia), a następnie wykonanie czystej kompilacji.

Zmiany między różnymi wersjami zestawu były zgodne z odnoszącymi się do nich częściami rozwiązania. Jeśli tak nie jest, może być konieczne wykonanie dodatkowej pracy w celu rozwiązania problemu.

NuGet

Dzięki NuGet łatwo jest znaleźć się w takiej sytuacji, jeśli:

  1. Instalujesz pakiet do jednego projektu w swoim rozwiązaniu.
  2. Nowa wersja tego pakietu została wdrożona w źródle pakietu.
  3. Instalujesz go w innym projekcie w tym samym rozwiązaniu.

Powoduje to, że w twoim rozwiązaniu są dwa projekty odwołujące się do różnych wersji zestawów tego pakietu. Jeśli jeden z nich odnosi się do drugiego i jest aplikacją ClickOnce, zobaczysz ten problem.

Aby to naprawić, wydaj update-package [package name]polecenie w konsoli Menedżera pakietów Nuget, aby wszystko wyrównać, w tym momencie problem zniknie.

Powinieneś zarządzać pakietami NuGet raczej na poziomie rozwiązania niż na poziomie projektu, chyba że istnieje ważny powód, aby tego nie robić. Zarządzanie pakietami na poziomie rozwiązania pozwala uniknąć wielu wersji zależności. Podczas korzystania z interfejsu zarządzania, jeśli karta Skonsolidowane pokazuje, że 1 lub więcej pakietów ma wiele wersji, rozważ konsolidację ich do jednej.

Zestaw
źródło
7
Oto kilka informacji: social.msdn.microsoft.com/Forums/en/csharplanguage/thread/… . Pomaga również wyczyszczenie bin i obj oraz (jeśli masz kontrolę) ustawienie wersji zestawu na tę samą wartość (np. Pozostawienie numeru kompilacji zero).
Kit
3
Trafiłem trochę na końcu twojej odpowiedzi, aby odzwierciedlić moje własne doświadczenia z NuGet i tym samym błędem. Mam nadzieję, że kiedyś to pomoże komuś (może nawet ja za kilka miesięcy!).
Neil Barnwell
2
Ten błąd ciągle wyskakuje dla mnie i usuwa nazwę zestawu z pliku .csproj, a następnie czyszczenie konsekwentnie go naprawia. Dzięki!
ScubaSteve,
1
Możesz zobaczyć tę odpowiedź, jeśli powyższa odpowiedź nie zadziałała i uważasz, że dodałeś odwołanie NuGet do jednego ze swoich projektów za pomocą Intellisense / ReSharper.
David Murdoch
Rozwiązanie zawiera 4 projekty. Jeden projekt B to biblioteka klas. Biblioteka DLL B została przywołana w pozostałych trzech. Dwa pozostałe projektu ( C i D ) wykonywalny są odniesione w A . Więc zbudowałem A i dostałem ten sam problem. Fix był najpierw odbudować resztę dwóch projektów. A następnie projekt odbudowy A Naprawiono problem.
Vikram Singh Saini
268

Kiedy miałem ten problem, naprawiłem go, wyłączając „Włącz ustawienia bezpieczeństwa ClickOnce”.

Menu: Projekt | „Nazwa projektu” Właściwości ... | Karta Zabezpieczenia | Pole wyboru „Włącz ustawienia bezpieczeństwa ClickOnce”.

CharleZ
źródło
2
Nie działało dla mnie w VS2012 (pole wyboru jest automatycznie sprawdzane automatycznie podczas publikowania). Użyłem tej odpowiedzi, ponieważ biblioteka DLL była potrzebna tylko w procesie kompilacji. stackoverflow.com/a/8123074/17713
Matthias Meid
3
Podczas korzystania z ClickOnce to pole wyboru jest automatycznie zaznaczane za każdym razem, gdy aplikacja jest publikowana za pomocą kreatora publikowania. Aby uzyskać więcej informacji, zobacz msdn.microsoft.com/en-us/library/1sfbfyk0.aspx .
David Murdoch
8
Mam MSVS 2015 i nie widzę zakładki bezpieczeństwa pod właściwościami projektu
zeta
70

Zobacz tę odpowiedź .

Przejdź do strony publikowania i kliknij „Pliki aplikacji”. Stamtąd powinna zostać wyświetlona lista bibliotek DLL. Upewnij się, że osoby sprawiające kłopoty mają status Publikowania oznaczony jako „Uwzględnij”, a nie „Wymaganie wstępne”.

Otiel
źródło
2
Projekt dodatku exel nie ma przycisku Pliki aplikacji. stackoverflow.com/questions/6378801/…
Sergey Kucher
@SergeyKucher: Nie wiedziałem o tym. Dziękuję za aktualizację. Ponieważ twoje pytanie nie precyzuje, że dotyczy ono dodatku Excel, myślę, że moja odpowiedź jest nadal aktualna (miałem ten sam komunikat o błędzie w projekcie winforms i rozwiązałem go w ten sposób).
Otiel,
Mam projekt winforms, który zbudował się dobrze, dopóki nie użyłem kreatora publikowania, po którym dostałem błędy OP. Zmiana stanu publikacji rozwiązała problem. Dzięki
Kristian,
7
W moim przypadku ten problem został rozwiązany, zmieniając Status publikowania z ZAWIERA (auto) na po prostu ZAWIERA. W każdym razie twoja odpowiedź pomogła nie narzucić pokazanych wartości. Wielkie dzięki
Julio Nobre,
22

Miałem ten problem. Stało się tak, ponieważ miałem wiele projektów wskazujących na ten sam zestaw, ale z różnych wersji. Rozwiązuję go, wybierając tę ​​samą wersję dla wszystkich projektów w moim rozwiązaniu.

Daniel
źródło
13

Jeśli zmieniłeś wersję zestawu lub skopiowałeś inną wersję biblioteki zarządzanej podaną w błędzie, być może wcześniej skompilowałeś pliki odwołujące się do niewłaściwej wersji. „Odbuduj wszystko” (lub usuwając foldery „bin” i „obj”, jak wspomniano we wcześniejszym komentarzu) powinno naprawić ten przypadek.

Sogger
źródło
1
Lub po prostu „Clean Solution”
Unsliced
„Przebuduj wszystko” najpierw wykonuje czyszczenie i jest równoważne „oczyszczeniu”, a następnie „kompilacji”. Warto jednak zauważyć, że czasami, gdy pliki zostały ręcznie skopiowane lub skopiowane przy użyciu różnych znaczników czasu, funkcja „czysta” / „przebuduj” nie rozwiązuje problemu i konieczne jest ręczne usunięcie folderów „bin” i „obj”.
Sogger
W przypadku tego problemu związanego z programem Excel usuwanie folderów bin / obj działało dla mnie, inne podejścia nie.
William Melani
6

musisz podpisać zestaw za pomocą klucza. Przejdź do właściwości projektu w obszarze podpisywania kart: wprowadź opis zdjęcia tutaj

Felice Pollano
źródło
6

Dodanie mojego rozwiązania tego problemu dla każdego, kto może mu pomóc.

Miałem rozwiązanie ClickOnce zgłaszające ten błąd. Aplikacja odnosiła się do wspólnego folderu „Libs” i zawierała odwołanie do projektu do Foo.dll. Chociaż żaden z projektów w rozwiązaniu nie odwoływał się do statycznej kopii Foo.dllw folderze „Libs”, niektóre z odnośników w tym folderze tak (tj. Moje rozwiązanie miało Libs\Bar.dllodniesienia do których odnośników Foo.dll). Ponieważ aplikacja CO wyciągnęła wszystkie zależności zLibs jak również ich zależności, obie kopie zostały włączone do projektu. To generowało błąd powyżej.

Naprawiłem problem przesuwając moją Libs\Foo.dllwersję statyczną do podfolderu, Libs\Fix\Foo.dll. Ta zmiana spowodowała, że ​​aplikacja ClickOnce używała tylko wersji DLL projektu i błąd zniknął.

Nick Gotch
źródło
6

Usunięcie biblioteki DLL (gdzie wystąpił błąd) i ponowne zbudowanie rozwiązania rozwiązało mój problem. Dzięki

Kishore
źródło
6

Jeśli wypróbowałeś wszystkie pozostałe odpowiedzi w tym pytaniu i:

  • Posiadaj wiele projektów w swoim rozwiązaniu
  • Mieć projekt (Projekt A), który odwołuje się do innego projektu (Projekt B), którego projekt odwołuje się do pakietu NuGet.
  • W Projekcie A użyłeś Intellisense / ReSharper, aby wprowadzić odwołanie do pakietu NuGet, do którego odwołuje się Projekt B (może się to zdarzyć, gdy metoda w Projekcie B zwróci typ dostarczony przez pakiet NuGet i ta metoda zostanie użyta w Projekcie A)
  • zaktualizowałem pakiet NuGet za pomocą Menedżera pakietów NuGet (lub CLI).

... możesz mieć osobne wersje biblioteki DLL pakietów NuGet w swoich projektach „Referencje, ponieważ referencja utworzona przez Intellisense / ReSharper będzie„ normalną ”referencją, a nie referencją NuGet zgodnie z oczekiwaniami, więc proces aktualizacji NuGet wygrał” znajdź lub zaktualizuj to!

Aby to naprawić, usuń odniesienie w Projekcie A, a następnie użyj NuGet, aby go zainstalować i upewnij się, że pakiety NuGet we wszystkich projektach mają tę samą wersję. (jak wyjaśniono w tej odpowiedzi )


Wskazówka Life Pro:

Ten problem może pojawić się za każdym razem, gdy ReSharper / Intellisense sugeruje dodanie odniesienia do twojego projektu. Może być znacznie bardziej skomplikowany niż w powyższym przykładzie, z wieloma projektami i zależnościami, które utrudniają odnalezienie. Jeśli referencje sugerowane przez ReSharper / Intellisense pochodzą z pakietu NuGet, użyj NuGet, aby je zainstalować.

David Murdoch
źródło
Tak, unikaj używania Resharper do dodawania referencji. Resharper pobierze referencyjną bibliotekę DLL z folderu debugowania (lub wydania, jeśli jesteś w trybie wydania). To spowoduje wiele problemów, szczególnie w dużych projektach.
cepriego,
5

Kiedy stało się tak z WindowsAPICodePack po jego aktualizacji, właśnie przebudowałem rozwiązanie.

Kompilacja -> Przebuduj rozwiązanie

Nathan
źródło
4

W moim rozwiązaniu było zbyt wiele projektów, aby przejść i indywidualnie je zaktualizować, więc naprawiłem to przez:

  • Kliknij prawym przyciskiem myszy moje rozwiązanie i wybierz „Zarządzaj pakietami NuGet dla rozwiązania ...”
  • Przechodzenie do karty Aktualizacje
  • Znajdowanie pakietu, którego dotyczy problem, i wybranie Aktualizuj
  • Kliknij OK, aby zaktualizować wszystkie wystąpienia pakietu
RagtimeWilly
źródło
4

Rozładowanie i ponowne załadowanie problemu rozwiązało to dla mnie.

ChrisO
źródło
4

Poszedłem opublikować , pliki aplikacji, znalazłem dll zgłaszający błąd zmieniłem go na „Include” z „Include (Auto)”. Mogę teraz opublikować.

Jimmy
źródło
4

Ten problem napotkałem po migracji dodatku Excel z Package.config do PackageReference. Wydaje się, że ma to związek z tym problemem .

Poniższe działa jako przybliżone obejście, jeśli nie używasz ClickOnce (spowoduje to pominięcie wszystkich informacji o zależnościach w .manifestpliku):

  1. Zwolnij projekt, edytuj .csproj
  2. Znajdź sekcję wyglądającą następująco:

    <!-- Include additional build rules for an Office application add-in. -->
    <Import Project="$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets" Condition="'$(VSToolsPath)' != ''" />
  3. Edytuj kopię .targetspliku o zmienionej nazwie (w moim przypadku plik został rozwiązany C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\OfficeTools\Microsoft.VisualStudio.Tools.Office.targetsi zrobiłem kopię Microsoft.VisualStudio.Tools.Office_FIX.targetsw tym samym folderze - nie sprawdziłem, czy działa z innego folderu).

  4. Znajdź GenerateApplicationManifestelement i zmień jego atrybut Dependencies="@(DependenciesForGam)"na Dependencies="".

  5. Zmień sekcję w 2., aby .targetszamiast tego odwoływała się do edytowanego pliku.

Będzie to musiało być powtarzane za każdym razem, gdy wersja .targetspliku dostarczonego z VS jest aktualizowana (w przeciwnym razie nie dostaniesz aktualizacji), ale mam nadzieję, że wkrótce zostanie naprawiona ...

FunctorSalad
źródło
2
Aby dodać do tego, nieco łagodniejszym sposobem rozwiązania problemu jest skopiowanie całej sekcji <Nazwa docelowa = "VisualStudioForApplicationsBuild"> z pliku znajdującego się w punkcie 3 (tj .: po prostu znajdź plik, nie kopiuj go i nie zmieniaj jego nazwy) , do pliku własnego projektu. ** proj i dokonaj tej samej zmiany, jak opisano w punkcie 4. To zastąpi zachowanie tylko dla twojego projektu i nie wpłynie na nic innego na twoim komputerze. Jeśli w przyszłej aktualizacji VS zostaną wprowadzone zmiany w oryginalnym pliku, może być konieczne powtórzenie tego procesu.
Adam
3

Czy Twój zespół jest właściwie podpisany?

Aby to sprawdzić, naciśnij Alt + Enter na swoim projekcie (lub kliknij prawym przyciskiem myszy, a następnie Właściwości). Przejdź do „Podpisywanie”. Sprawdź, czy pole wyboru „Podpisz zespół” jest zaznaczone, czy plik klucza z silną nazwą jest zaznaczony, a pole „Tylko znak opóźnienia” nie jest zaznaczone .

Arseni Mourzenko
źródło
Nie podpisałem * .dll, ale wcześniej nie było z tym problemu (wcześniej nie miałem błędu kompilacji). Dll, do którego odwołuje się jeden z odnośnych projektów opublikowanego, znalazłem brzydkie rozwiązanie do odwoływania się do dll bezpośrednio z opublikowanego projektu, czy możesz mi powiedzieć, dlaczego teraz działa? Lub jak mogę rozwiązać problem w inny sposób? Dziękuję
Sergey Kucher
1
@ user520535: cóż, jeśli wcześniej nie podpisałeś biblioteki, powinieneś. Nie jest to jedyny sposób, aby ta biblioteka mogła być używana przez podpisane zestawy (podpisany zestaw nie może wywoływać zestawu niepodpisanego), ale praca z nie podpisanymi zestawami jest również bardzo trudna, gdy masz do czynienia z wtyczkami / dodatkami -ins. Dlaczego teraz zaczął powodować problemy teraz, a nie wcześniej? Nie mam pojęcia.
Arseni Mourzenko
@ user520535: jeśli pomógł, możesz zaakceptować lub głosować odpowiedź.
Arseni Mourzenko
3

Oto inne podejście do problemu:

  • Kliknij projekt prawym przyciskiem myszy i wybierz opcję „Zwolnij projekt”. Zauważysz, że Twój projekt staje się niedostępny.

  • Kliknij prawym przyciskiem myszy niedostępny projekt i wybierz opcję „Edytuj”.

  • Przewiń w dół do znacznika „<ItemGroup>”, który zawiera wszystkie znaczniki zasobów.

  • Teraz przejdź do odwołania wyświetlonego na liście błędów, zauważysz, że używa pojedynczego znacznika (tj < Reference Include="assemble_name_here, Version=0.0.0.0, Culture=neutral" / >.).

  • Zmień to, aby wyglądać następująco:

.

<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 >
  • Zapisz zmiany, ponownie kliknij prawym przyciskiem myszy niedostępny projekt i kliknij opcję „Załaduj ponownie projekt”, a następnie skompiluj.
Tech
źródło
3

Jest to spowodowane zmianą przywoływanej wersji .dll. Musisz usunąć wszystkie elementy lub .dll w docelowym folderze kompilacji.

Hoang Ha
źródło
2

Mam podobny błąd kompilatora. Po dodaniu zależnego projektu pliku DLL do rozwiązania problem został rozwiązany.

Minny
źródło
2

Jeśli twój główny projekt korzysta z niektórych projektów bibliotecznych i masz do nich odniesienia, możesz spowodować ten problem, jeśli odwołanie do pliku dll zestawu zamiast do projektu biblioteki, gdy zmienisz coś w projekcie biblioteki (np. Zmień nazwę klasy).

Możesz sprawdzić wszystkie odniesienia do głównego projektu, przeglądając w oknie Przeglądarki obiektów (menu Widok-> Przeglądarka obiektów). Odwołanie do pliku dll ma zawsze numer wersji. Przykład: TestLib [1.0.0.0]

Rozwiązanie: usuń bieżące odniesienie głównego projektu do projektu biblioteki i ponownie dodaj odwołanie do tego projektu biblioteki.

Huy Nguyen
źródło
1

Po wypróbowaniu większości rozwiązań tutaj, w końcu właśnie dodałem odniesienie do projektu z projektu „kliknij raz”, co zmieniło go na Uwzględnij (Auto) z Uwzględnij i wreszcie działało.

PatFromCanada
źródło
1

Pomogło mi to, że wszedłem do Menedżera pakietów i spojrzałem na zainstalowany pakiet, który był przyczyną problemu. Widziałem, że kilka projektów odnosi się do tego samego pakietu, ale różnych wersji. Dopasowałem je w zależności od moich potrzeb i zadziałało.

Artexias
źródło
0

Miałem to w rozwiązaniu z 6 projektami. Jeden z moich projektów odwoływał się do nazwanego zestawu jako odwołania do pliku. Wszyscy inni wskazywali na odniesienie do projektu.

W takich przypadkach zwykle pojawia się inny błąd.

Moim rozwiązaniem było usunięcie nazwanego zestawu w dowolnym miejscu, do którego się on odwołuje, i dodanie go z powrotem. Gdy pracowałem nad projektem, problem zniknął. Zanim to zrobiłem, spróbowałem wyczyścić rozwiązanie, a także upewnić się, że żaden z projektów nie został podpisany.

mam nadzieję, że to pomoże komuś ...

greg
źródło
0

Jeśli jest to niezgodność zależności, przejdź do menedżera pakietów NuGet na poziomie rozwiązania i sprawdź karty Aktualizuj i Konsoliduj, zharmonizuj wszystko.

Luke Puplett
źródło
0

Niedawno trafiłem na ten problem. W moim przypadku mam pakiety NuGet na różnych zestawach. Miałem różne wersje tych samych pakietów NuGet powiązanych z moimi własnymi zestawami.
Moim rozwiązaniem było użycie menedżera pakietów NuGet w Rozwiązaniu, w przeciwieństwie do poszczególnych projektów. Umożliwia to opcję „konsolidacji”, w której można aktualizować pakiety NuGet w dowolnej liczbie projektów - wszystkie odnoszą się do tej samej wersji zestawu. Gdy wykonałem konsolidację, błąd kompilacji zniknął.

Simon Miller
źródło
0

Wpadłem również na pewien problem, wystarczyło tylko usunąć plik .dll (można go znaleźć w odnośniku), który powoduje błąd, i dodać go ponownie .

Działa jak marzenie.

FritsJ
źródło
0

Spróbuj z pakietem aktualizacji -reinstall -ignoredependencies

Stella Oliveira
źródło
0

Wystarczy przejść do Publikuj -> Plik aplikacji -> I zmień status opublikowanego pliku dll z wymagań wstępnych na dołączony! To zadziałało dla mnie!

SWIK
źródło