2015-06-19 18 views
7

Ich habe eine .NET-Anwendung, die scheint, einige seiner Abhängigkeitsversionen zwischen dem Debuggen und Ausführen als eine installierte Release-App zu haben. Ich werde mich nur auf die Castle.Core Assembly für meine Details konzentrieren, aber das gleiche Problem tritt bei einigen anderen auch auf. Ein NuGet-Paket, das ich verwende, benötigt Castle.Core als Abhängigkeit (alle Fälle meines Problems beziehen sich auf Assemblys, die von NuGet stammen, falls es darauf ankommt).Assembly Abhängigkeiten ändern nach der Installation

Wenn ich in Visual Studio das NuGet-Paket mit der Castle.Core-Abhängigkeit installiere, läuft alles einwandfrei, sowohl in Debug- als auch in Release-Konfigurationen. Ich kann sehen, dass der Castle.Core-Projektverweis auf Version 3.3.0.0 verweist. Allerdings, wenn ich alles von der Release-Konfiguration mithilfe von Installshield und installieren Sie die Anwendung (mit allen Baugruppen leben im gleichen Programm dir) erzeugte verpacken, erhalte ich diesen Laufzeitfehler:

Could not load file or assembly 'Castle.Core, Version=3.2.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Das NuGet Paket listet die Abhängigkeit von Castle .Core as (≥3.2.0.0 & & < 4.0.0.0). Sowohl 3.2.0.0 als auch 3.3.0.0 erfüllen diese Bedingungen.

Wenn ich Castle.Core manuell auf 3.2.0.0 heruntergrade, zeigt die Referenz meines Projekts, dass es in der Tat herabgestuft wurde. Aber wenn ich das Projekt in Visual Studio laufen lasse, erhalte ich:

Could not load file or assembly 'Castle.Core, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

mit einer inneren Ausnahme von:

Could not load file or assembly 'Castle.Core, Version=3.2.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Allerdings, wenn ich es dann in ein Installer-Paket, und starten Sie es als installierte Anwendung , Es klappt.

Für mich fühlt es sich so an, als würde die Verpackung der Assemblies in ein Installationsprogramm die Abhängigkeitsversionen ändern. Ich kann mir das nicht vorstellen, aber ich habe Schwierigkeiten, eine bessere Erklärung zu finden.

Kann mir jemand erklären, was hier passiert und wie ich es beheben könnte?

Antwort

12

Ok, habe es herausgefunden. Zuerst facepalm

Die über NuGet hinzugefügte Assembly hat eine bestimmte Versionsabhängigkeit von Castle.Core 3.2.0. Da diese Assembly jedoch weiterhin mit Castle.Core 3.2.0-4.0.0 arbeiten kann, wurde eine Assembly-Bindungsumleitung zu App.config hinzugefügt, die dem Assembly-Loader anzeigt, dass Assemblys, die eine Version in diesem Bereich erfordern, versuchen sollten, Castle zu laden .Core 3.3.0, das ist die Version, die in meinem App Installer gepackt wird. Ich wusste nicht, dass ich die Konfigurationsdatei nicht in mein Installationsprogramm aufgenommen hatte, daher wurde die Konfiguration ohne Probleme von Visual Studio geladen, während die installierte Anwendung diese Datei im Anwendungsverzeichnis fehlte.

+1

Ich hätte das nie herausgefunden, danke für die Beantwortung Ihrer eigenen Frage. –

+1

Sparte mir viel Zeit! –

+0

Also die Lösung war 'App.config' in Ihrem Installer zu enthalten? – Jess

3

Ich hatte das gleiche Problem, ich habe nur die wenigsten verfügbaren Moq-Version heruntergestuft und es hat funktioniert.

+0

Ich habe versucht, die Assembly Redirects zu reparieren, aber es wurde einfach immer komplizierter. Downgrade hat für mich funktioniert. – Phill

+0

Nizza. Vielen Dank –

Verwandte Themen