Warum bekomme ich 'Assembly' * .dll 'muss stark signiert sein, um als Voraussetzung markiert zu werden.'?

266

Ich versuche, mein Excel-Add-In mit C # 4.0 zu kompilieren, und habe dieses Problem beim Erstellen meines Projekts in Visual Studio festgestellt. Es ist wichtig, Ihnen zu sagen, dass ich dieses Problem noch nie hatte. Was könnte dazu führen?

Sergey Kucher
quelle
72
Als schneller Versuch, räumt sowohl die binund objOrdner Ihres Projektes, und das Projekt erneut aufzubauen. Manchmal funktioniert das.
Jason Evans
Unterschreiben Sie die Versammlung?
Felice Pollano
3
@ Jason, das Projekt zu reinigen und wieder aufzubauen hat bei mir funktioniert. Ich hatte erst kürzlich die Baugruppen unterschrieben und das Projekt wurde erstellt, aber nicht veröffentlicht.
Kratz
1
@Kratz - Ich bin froh, dass dieser Tipp für Sie funktioniert hat :) Es ist ein bisschen so, als würden Sie Ihren Computer durch einen Neustart reparieren!
Jason Evans
Dies geschah mir, als der Konfigurationsmanager die Build-Einstellungen für einige meiner Projekte zurücksetzte (dh sie waren nicht auf "Alle neu erstellen" eingestellt), nachdem die Versionierung dieser Projekte und die Neuerstellung des Fehlers aufgetreten waren.
Alan

Antworten:

239

Ich vermute, dass Sie nicht mit stark benannten Assemblys arbeiten. Ich hatte diesen Fehler, wenn zwei Projekte auf leicht unterschiedliche Versionen derselben Assembly verweisen und ein abhängigeres Projekt auf diese Projekte verweist. In meinem Fall bestand die Lösung darin, die Schlüssel- und Versionsinformationen aus dem Assemblynamen in den .csproj-Dateien zu entfernen (es war sowieso egal) und dann einen sauberen Build durchzuführen.

Änderungen zwischen den verschiedenen Baugruppenversionen waren mit den darauf bezogenen Teilen der Lösung kompatibel. Wenn dies bei Ihnen nicht der Fall ist, müssen Sie möglicherweise weitere Arbeiten ausführen, um das Problem zu beheben.

NuGet

Mit NuGet ist es einfach, in diese Situation zu geraten, wenn:

  1. Sie installieren ein Paket für ein Projekt in Ihrer Lösung.
  2. Eine neue Version dieses Pakets wird für die Paketquelle bereitgestellt.
  3. Sie installieren es in einem anderen Projekt in derselben Lösung.

Dies führt zu zwei Projekten in Ihrer Lösung, die auf verschiedene Versionen der Assemblys dieses Pakets verweisen. Wenn einer von ihnen auf den anderen verweist und eine ClickOnce-App ist, wird dieses Problem angezeigt.

Um dies zu beheben, geben Sie den update-package [package name]Befehl in der Nuget Package Manager-Konsole ein, um alles auf gleiche Wettbewerbsbedingungen zu bringen. An diesem Punkt verschwindet das Problem.

Sie sollten NuGet-Pakete eher auf Lösungsebene als auf Projektebene verwalten, es sei denn, es gibt einen zwingenden Grund, dies nicht zu tun. Die Paketverwaltung auf Lösungsebene vermeidet das Potenzial mehrerer Versionen von Abhängigkeiten. Wenn bei Verwendung der Verwaltungsbenutzeroberfläche auf der Registerkarte " Konsolidiert" ein oder mehrere Pakete mit mehreren Versionen angezeigt werden, sollten Sie sie auf eine konsolidieren.

Kit
quelle
7
Hier finden Sie weitere Informationen: social.msdn.microsoft.com/Forums/en/csharplanguage/thread/… . Außerdem hilft es , bin und obj zu löschen und (wenn Sie die Kontrolle haben) die Assembly-Version auf denselben Wert zu setzen (z. B. die Build-Nummer Null zu lassen).
Kit
3
Ich habe mich ein wenig mit dem Ende Ihrer Antwort befasst, um meine heutigen Erfahrungen mit NuGet und denselben Fehler widerzuspiegeln. Hoffe, es hilft irgendwann jemandem (möglicherweise sogar mir selbst in ein paar Monaten!).
Neil Barnwell
2
Dieser Fehler tritt immer wieder bei mir auf und entfernt den Namen der Assembly aus der .csproj-Datei. Durch die Bereinigung wurde er für mich konsistent behoben. Vielen Dank!
ScubaSteve
1
Möglicherweise möchten Sie diese Antwort sehen, wenn die obige Antwort nicht funktioniert hat und Sie glauben, dass Sie die NuGet-Referenz mit Intellisense / ReSharper zu einem Ihrer Projekte hinzugefügt haben.
David Murdoch
Die Lösung enthält 4 Projekte. Ein Projekt B ist die Klassenbibliothek. B's DLL wurde in den restlichen drei referenziert. Die anderen beiden ausführbaren Dateien des Projekts ( C und D ) werden in A referenziert . Also baue ich A und habe das gleiche Problem. Das Update bestand darin, zunächst die restlichen zwei Projekte neu zu erstellen. Und dann Projekt neu aufbauen Ein behobenes Problem.
Vikram Singh Saini
268

Als ich dieses Problem hatte, habe ich es behoben, indem ich die "ClickOnce-Sicherheitseinstellungen aktivieren" deaktiviert habe.

Menü: Projekt | Eigenschaften 'Projektname' ... | Registerkarte Sicherheit | Kontrollkästchen "ClickOnce-Sicherheitseinstellungen aktivieren".

CharleZ
quelle
2
Hat bei mir in VS2012 nicht funktioniert (das Kontrollkästchen wird während der Veröffentlichung automatisch erneut aktiviert). Ich habe stattdessen diese Antwort verwendet, da die DLL nur für den Erstellungsprozess benötigt wurde. stackoverflow.com/a/8123074/17713
Matthias Meid
3
Bei Verwendung von ClickOnce wird dieses Kontrollkästchen jedes Mal automatisch aktiviert, wenn die Anwendung mit dem Veröffentlichungsassistenten veröffentlicht wird. Weitere Informationen finden Sie unter msdn.microsoft.com/en-us/library/1sfbfyk0.aspx .
David Murdoch
8
Ich habe MSVS 2015 und ich sehe die Registerkarte Sicherheit unter Projekteigenschaften nicht
zeta
70

Siehe diese Antwort .

Gehen Sie zur Veröffentlichungsseite und klicken Sie auf "Anwendungsdateien". Von dort sollten Sie eine Liste Ihrer DLLs sehen. Stellen Sie sicher, dass für diejenigen, die Ihnen Probleme bereiten, der Veröffentlichungsstatus als "Einschließen" und nicht als "Voraussetzung" markiert ist.

Otiel
quelle
2
Das Exel-Add-In-Projekt verfügt nicht über die Schaltfläche Anwendungsdateien. stackoverflow.com/questions/6378801/…
Sergey Kucher
@ SergeyKucher: Das wusste ich nicht. Danke für das Update. Da Ihre Frage nicht genau ist, ob es sich um ein Excel-Add-In handelt, ist meine Antwort hier immer noch gültig (ich hatte dieselbe Fehlermeldung in einem Winforms- Projekt und habe sie auf diese Weise gelöst).
Otiel
Ich habe ein Winforms-Projekt, das einwandfrei funktioniert hat, bis ich den Veröffentlichungsassistenten verwendet habe. Danach habe ich die Fehler des OP erhalten. Durch Ändern des Veröffentlichungsstatus wurde das Problem behoben. Vielen Dank
Kristian
7
In meinem Fall wurde dieses Problem behoben, indem der Veröffentlichungsstatus von INCLUDE (auto) in nur INCLUDE geändert wurde. Wie auch immer, Ihre Antwort hat dazu beigetragen, nicht auf die angezeigten Werte zu stoßen. Vielen Dank
Julio Nobre
22

Ich habe dieses Problem gehabt. Es geschah, weil ich viele Projekte hatte, die auf dieselbe Baugruppe zeigten, aber aus verschiedenen Versionen. Ich löse es, indem ich für alle Projekte in meiner Lösung dieselbe Version auswähle.

Daniel
quelle
13

Wenn Sie Ihre Assemblyversion geändert oder eine andere Version der im Fehler angegebenen verwalteten Bibliothek kopiert haben, haben Sie möglicherweise auch zuvor Dateien kompiliert, die auf die falsche Version verweisen. Ein "Alle neu erstellen" (oder das Löschen Ihrer Ordner "bin" und "obj", wie in einem früheren Kommentar erwähnt) sollte diesen Fall beheben.

Sogger
quelle
1
Oder einfach 'Clean Solution'
Ungeschnitten
Ein "Alle neu erstellen" führt zuerst eine Bereinigung durch und entspricht "Reinigen" und dann "Erstellen". Es ist jedoch zu beachten, dass manchmal, wenn Dateien manuell oder mit unterschiedlichen Zeitstempeln kopiert wurden, die Funktion "Bereinigen" / "Wiederherstellen" das Problem nicht behebt und das manuelle Löschen der Ordner "bin" und "obj" erforderlich ist.
Sogger
Bei diesem Excel-Problem hat das Löschen der Ordner bin / obj bei mir funktioniert, bei den anderen Ansätzen jedoch nicht.
William Melani
6

Sie müssen die Baugruppe mit einem Schlüssel signieren. Gehen Sie in die Projekteigenschaften unter der Registerkarte Signieren: Geben Sie hier die Bildbeschreibung ein

Felice Pollano
quelle
6

Das Hinzufügen meiner Lösung für dieses Problem für jeden, dem es helfen könnte.

Ich hatte eine ClickOnce-Lösung, die diesen Fehler auslöste. Die App verwies auf einen gemeinsamen "Libs" -Ordner und enthielt einen Projektverweis auf a Foo.dll. Während keines der Projekte in der Lösung auf die statische Kopie des Foo.dllOrdners im Ordner "Libs" verwies, war dies bei einigen Verweisen in diesem Ordner der Fall (dh: Meine Lösung hatte Libs\Bar.dllVerweise, auf die verwiesen wurde Foo.dll). Da die CO-App alle Abhängigkeiten abgerufen hat LibsBeide Kopien gingen neben ihren Abhängigkeiten in das Projekt ein. Dies erzeugte den obigen Fehler.

Ich habe das Problem behoben, indem ich meine Libs\Foo.dllstatische Version in einen Unterordner verschoben habe Libs\Fix\Foo.dll. Durch diese Änderung verwendete die ClickOnce-App nur die Projektversion der DLL und der Fehler verschwand.

Nick Gotch
quelle
6

Das Löschen der DLL (wo der Fehler aufgetreten ist) und das Neuerstellen der Lösung haben mein Problem behoben. Vielen Dank

Kishore
quelle
6

Wenn Sie alle anderen Antworten in dieser Frage ausprobiert haben und Sie:

  • Haben Sie mehrere Projekte in Ihrer Lösung
  • Haben Sie ein Projekt (Projekt A), das auf ein anderes Projekt (Projekt B) verweist, dessen Projekt auf ein NuGet-Paket verweist.
  • In Projekt A haben Sie Intellisense / ReSharper verwendet, um den Verweis auf das in Projekt B referenzierte NuGet-Paket einzufügen (dies kann passieren, wenn eine Methode in Projekt B einen vom NuGet-Paket bereitgestellten Typ zurückgibt und diese Methode in Projekt A verwendet wird).
  • Das NuGet-Paket wurde über NuGet Package Manager (oder CLI) aktualisiert.

... Sie haben möglicherweise separate Versionen der NuGet-Paket-DLL in Ihren Projektreferenzen, da die von Intellisense / ReSharper erstellte Referenz eine "normale" Referenz ist und nicht wie erwartet eine NuGet-Referenz, sodass der NuGet-Aktualisierungsprozess gewonnen hat. t finde oder aktualisiere es!

Um dies zu beheben, entfernen Sie den Verweis in Projekt A, installieren Sie ihn mit NuGet und stellen Sie sicher, dass die NuGet-Pakete in allen Projekten dieselbe Version haben. (wie in dieser Antwort erklärt )


Life Pro-Tipp:

Dieses Problem kann auftreten, wenn ReSharper / Intellisense vorschlägt, einen Verweis auf Ihr Projekt hinzuzufügen. Es kann viel komplizierter sein als das obige Beispiel, da mehrere miteinander verwobene Projekte und Abhängigkeiten es schwierig machen, es aufzuspüren. Wenn die von ReSharper / Intellisense vorgeschlagene Referenz tatsächlich aus einem NuGet-Paket stammt, installieren Sie sie mit NuGet.

David Murdoch
quelle
Ja, vermeiden Sie die Verwendung von Resharper zum Hinzufügen von Referenzen. Resharper übernimmt die Referenz-DLL aus dem Debug-Ordner (oder Release, wenn Sie sich im Release-Modus befinden). Das wird viele Probleme verursachen, insbesondere bei großen Projekten.
Cepriego
5

Als mir dies mit dem WindowsAPICodePack nach der Aktualisierung passiert ist, habe ich die Lösung neu erstellt.

Build -> Lösung neu erstellen

Nathan
quelle
4

Meine Lösung enthielt zu viele Projekte, um sie einzeln zu aktualisieren. Daher habe ich Folgendes behoben:

  • Klicken Sie mit der rechten Maustaste auf meine Lösung und wählen Sie "NuGet-Pakete für Lösung verwalten ...".
  • Wechseln Sie zur Registerkarte Updates
  • Suchen Sie das betroffene Paket und wählen Sie Aktualisieren
  • Klicken Sie auf OK, um alle Instanzen des Pakets auf den neuesten Stand zu bringen
RagtimeWilly
quelle
4

Das Entladen und Neuladen des Problemprojekts hat es für mich gelöst.

ChrisO
quelle
4

Ich ging zum Veröffentlichen , Anwendungsdateien, fand die DLL, die den Fehler auslöste, änderte sie in "Einschließen" von "Einschließen (Auto)". Ich kann jetzt veröffentlichen.

Jimmy
quelle
4

Ich bin auf dieses Problem gestoßen, nachdem ich ein Excel-Add-In von packages.config nach PackageReference migriert habe. Scheint mit diesem Problem verbunden zu sein .

Folgendes funktioniert als grobe Problemumgehung, wenn Sie ClickOnce nicht verwenden (es werden alle Abhängigkeitsinformationen aus der .manifestDatei weggelassen):

  1. Projekt entladen, .csproj bearbeiten
  2. Finden Sie den Abschnitt, der so aussieht:

    <!-- Include additional build rules for an Office application add-in. -->
    <Import Project="$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets" Condition="'$(VSToolsPath)' != ''" />
  3. Bearbeiten Sie eine umbenannte Kopie der referenzierten .targetsDatei (in meinem Fall wurde die Datei aufgelöst C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\OfficeTools\Microsoft.VisualStudio.Tools.Office.targetsund ich habe eine Kopie Microsoft.VisualStudio.Tools.Office_FIX.targetsim selben Ordner erstellt - habe nicht überprüft, ob sie aus einem anderen Ordner funktioniert).

  4. Suchen Sie das GenerateApplicationManifestElement und ändern Sie sein Attribut Dependencies="@(DependenciesForGam)"in Dependencies="".

  5. Ändern Sie den Abschnitt in 2., um .targetsstattdessen auf Ihre bearbeitete Datei zu verweisen .

Dies muss wiederholt werden, wenn die .targetsmit VS gelieferte Version der Datei aktualisiert wird (oder Sie die Updates nicht erhalten), aber ich hoffe, dass sie bald behoben wird ...

FunctorSalad
quelle
2
Eine etwas schonendere Möglichkeit, das Problem zu beheben, besteht darin, den gesamten Abschnitt <Target Name = "VisualStudioForApplicationsBuild"> aus der Datei in Punkt 3 zu kopieren (dh: Suchen Sie einfach die Datei, kopieren Sie sie nicht und benennen Sie sie um). Nehmen Sie die gleiche Änderung wie in Punkt 4 beschrieben vor. Dies überschreibt das Verhalten nur für Ihr Projekt und wirkt sich dann nicht auf andere Elemente auf Ihrem Computer aus. Wenn in einem zukünftigen VS-Update Änderungen an der Originaldatei vorgenommen werden, müssen Sie den Vorgang möglicherweise noch wiederholen.
Adam
3

Ist Ihre Baugruppe ordnungsgemäß signiert?

Um dies zu überprüfen, drücken Sie Alt + Eingabetaste in Ihrem Projekt (oder klicken Sie mit der rechten Maustaste und dann auf Eigenschaften). Gehen Sie zu "Signieren". Stellen Sie sicher, dass das Kontrollkästchen "Baugruppe signieren" aktiviert und die Schlüsseldatei für den starken Namen ausgewählt und "Nur Verzögerungszeichen" deaktiviert ist .

Arseni Mourzenko
quelle
Ich habe die * .dll nicht signiert, aber es gab vorher kein Problem damit (ich hatte vorher keinen Kompilierungsfehler). Die DLL, auf die in einem der referenzierten Projekte des veröffentlichten verwiesen wird. Ich habe eine hässliche Lösung gefunden, um die DLL direkt aus dem veröffentlichten Projekt zu referenzieren. Können Sie mir bitte sagen, warum sie jetzt funktioniert? Oder wie könnte ich das Problem opther lösen? Vielen Dank
Sergey Kucher
1
@ user520535: Nun, wenn Sie die Bibliothek noch nicht signiert haben, sollten Sie dies tun. Es ist nicht die einzige Möglichkeit, diese Bibliothek von signierten Assemblys verwenden zu können (eine signierte Assembly kann keine nicht signierte Assembly aufrufen), aber die Arbeit mit nicht signierten Assemblys ist auch sehr schwierig, wenn Sie mit Plug-Ins / Add arbeiten -ins. Warum begann es jetzt und nicht vorher Probleme zu verursachen? Ich habe keine Ahnung.
Arseni Mourzenko
@ user520535: Wenn es geholfen hat, können Sie die Antwort akzeptieren oder positiv bewerten.
Arseni Mourzenko
3

Hier ist eine andere Herangehensweise an das Problem:

  • Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie die Option "Projekt entladen". Sie werden feststellen, dass Ihr Projekt nicht mehr verfügbar ist.

  • Klicken Sie mit der rechten Maustaste auf das nicht verfügbare Projekt und wählen Sie die Option "Bearbeiten".

  • Scrollen Sie nach unten zum Tag '<ItemGroup>', das alle Ressourcen-Tags enthält.

  • Gehen Sie nun zu der Referenz, die in der Fehlerliste angezeigt wurde. Sie werden feststellen, dass ein einzelnes Tag (dh < Reference Include="assemble_name_here, Version=0.0.0.0, Culture=neutral" / >) verwendet wird.

  • Ändern Sie dies wie folgt:

.

<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 >
  • Speichern Sie Ihre Änderungen. Klicken Sie erneut mit der rechten Maustaste auf das nicht verfügbare Projekt und klicken Sie auf die Option "Projekt neu laden". Erstellen Sie dann.
Technik
quelle
3

Dies wird verursacht, wenn Sie die Version der DLL ändern, auf die verwiesen wird. Sie müssen alle Elemente oder die DLL im Zielerstellungsordner löschen.

Hoang Ha
quelle
2

Ich habe den ähnlichen Compilerfehler. Sobald ich das abhängige Projekt der DLL-Datei zur Lösung hinzugefügt habe, ist das Problem behoben.

Minny
quelle
2

Wenn Ihr Hauptprojekt einige Bibliotheksprojekte verwendet und auf diese verweist, können Sie dieses Problem verursachen, wenn Ihr Projekt auf eine Assembly-DLL-Datei anstatt auf ein Bibliotheksprojekt verweist, wenn Sie etwas in Ihrem Bibliotheksprojekt ändern (z. B. eine Klasse umbenennen).

Sie können alle Verweise auf Ihr Hauptprojekt anhand der Ansicht im Objektbrowser-Fenster (Menü Ansicht-> Objektbrowser) überprüfen. Ein Verweis auf eine DLL-Datei hat immer eine Versionsnummer. Beispiel: TestLib [1.0.0.0]

Lösung: Löschen Sie die aktuelle Referenz Ihres Hauptprojekts zum Bibliotheksprojekt und fügen Sie erneut eine Referenz zu diesem Bibliotheksprojekt hinzu.

Huy Nguyen
quelle
1

Nachdem ich die meisten Lösungen hier ausprobiert hatte, fügte ich schließlich einen Verweis auf das Projekt aus dem Click-Once-Projekt hinzu. Dies änderte es in Include (Auto) von Include und es funktionierte schließlich.

PatFromCanada
quelle
1

Was mir geholfen hat, war, dass ich zu Package Manager Solution gegangen bin und mir das installierte Paket angesehen habe, das das Problem verursacht hat. Ich habe gesehen, dass mehrere Projekte auf dasselbe Paket, aber unterschiedliche Versionen verweisen. Ich habe sie nach meinen Bedürfnissen ausgerichtet und es hat funktioniert.

Artexien
quelle
0

Ich hatte dies in einer Lösung mit 6 Projekten. Eines meiner Projekte bezog sich auf die benannte Assembly als Dateireferenz. Die anderen zeigten alle auf die Projektreferenz.

In diesen Fällen wird normalerweise ein anderer Fehler angezeigt.

Meine Lösung bestand darin, die benannte Assembly an einer beliebigen Stelle zu löschen und wieder hinzuzufügen. Nachdem ich das Projekt durchgearbeitet hatte, verschwand dieses Problem. Vorher habe ich versucht, die Lösung zu reinigen und sicherzustellen, dass keines der Projekte unterzeichnet wurde.

hoffe es hilft jemandem ...

greg
quelle
0

Wenn die Abhängigkeiten nicht übereinstimmen, rufen Sie den NuGet-Paketmanager auf Lösungsebene auf, überprüfen Sie die Registerkarten Aktualisieren und Konsolidieren und harmonisieren Sie alles.

Luke Puplett
quelle
0

Ich bin kürzlich auf dieses Problem gestoßen. In meinem Fall habe ich NuGet-Pakete auf verschiedenen Baugruppen. Was ich hatte, waren verschiedene Versionen derselben NuGet-Pakete, die meinen eigenen Assemblys zugeordnet waren.
Meine Lösung bestand darin, den NuGet-Paketmanager für die Lösung zu verwenden, im Gegensatz zu den einzelnen Projekten. Dies ermöglicht eine "Konsolidierungs" -Option, bei der Sie Ihre NuGet-Pakete für beliebig viele Projekte aktualisieren können, sodass alle auf dieselbe Version der Assembly verweisen. Als ich die Konsolidierungen durchführte, verschwand der Build-Fehler.

Simon Miller
quelle
0

Ich stoße auch auf ein Problem. Alles, was ich tun musste, ist die DLL ( siehe Referenz), die den Fehler verursacht, zu löschen und erneut hinzuzufügen .

Klappt wunderbar.

FritsJ
quelle
0

Versuchen Sie es mit update-package -reinstall -ignoredependencies

Stella Oliveira
quelle
0

Gehen Sie einfach zu Veröffentlichen -> Anwendungsdatei -> und ändern Sie den Status der betroffenen DLL-Veröffentlichung von der Voraussetzung zum Einschließen! Das hat bei mir funktioniert!

SWIK
quelle