Hallo zusammen,
im Moment stecke ich in einer DLL Hell und weiß nicht wie ich da heraus komme.
Also ich habe mehrere Projekte, die aufeinander aufbauen:
Projekt.DomainModel
Projekt.Provider
Projekt.BusinesLayer (Projekt.BLL)
Alle drei Projekte bedarf die DLL des Vorgängers und wird per Reference eingebunden.
Also jeweils im Projekt=> Verweise.
Alle Projekte haben als Zielframework .NET 4.7, Plattformziel:Any und sind Klassenbibliotheken.
Am Ende wird die Projekt.BLL in eine weitere ASP.NET MVC5 Anwendung eingebunden.
Ebenfalls .NET 4.7, AnyCPU.
In der Webanwendung erstelle ich eine Klasse vom Typ Projekt.Provider.
An der Stelle kommt die Fehlermeldung, dass > Fehlermeldung:
System.Net.Http 4.2.0.0 nicht gefunden werden kann .
Hier habe ich mal aufgelistet, welches Projekt auf welche System.Net.Http referenziert.
Ich gehe dabei auf die referenzierte DLL im Projektmanager und dann auf Eigenschaften.
Alle System.Net.Http sind über Nuget, Version 4.3.4 eingebunden.
Projekt.DomainModel:
Version: 4.1.1.3
Pfad:
C:\Users\MeinUser\Documents\Visual Studio 2017\Projects\MeinProjekt\Projekt.Sort.Solution\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll
++
Projekt.Provider:++
Version: 4.2.0.0
Pfad:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll
++
Projekt.BusinessLayer++
Version: 4.1.1.3
Pfad:
C:\Users\MeinUser\Documents\Visual Studio 2017\Projects\MeinProjekt\Projekt.Sort.Solution\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll
Webanwendung:
Version: 4.1.1.3
Pfad:
C:\Users\MeinUser\Documents\MeinPfad\Entwicklung\WebProjekt\MeinProjekt\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll
Eigentlich ist der Fall glasklar:
Die System.Net.Http im Projekt Projekt.Provider referenziert nicht auf die Packages im Projektordner, sondern auf den lib Ordner.
Darum sucht die Webanwendung die Version 4.2.0.0, die natürlich sonst nirgends vorhanden ist.
Aber warum ist das so?
Ich installiere System.Net.Http immer über den Nuget Package Manager. Dieser macht das ja automatisch.
Wo kann hier eine Konfiguration anders sein?
Wie kann man so etwas in Zukunft vermeiden?
Nachtrag:
Vergleiche ich die .csproj Dateien der Projekt.BLL und Projekt.Provider sehe ich was erstaunliches:
Projekt:BLL:
<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
</Reference>
Projekt.Provider:
<Reference Include="System.Net" />
<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
Zumindest der HintPath ist derselbe.
Hallo Schuppsl,
Versuch mal das zweite <Private>True</Private> zu löschen.
Die 4.2.ér Version scheint nicht von deinem Projekt, sondern von einem BuildTarget referenziert zu sein.
Ist denn die Datei
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll
vorhanden?
Sollten nicht beide <Private>True</Private>
komplett gelöscht werden (bzw. auf False
stehen), denn dieser Eintrag entspricht "Copy Local" (s.a What does the Private setting do on a ProjectReference in a MSBuild project file?)?
Hallo Ihr beiden,
vielen Dank.
Leider jedoch hat das Löschen beider <private> Einträge nichts geholfen.
Die DLL existiert im angegebenen Pfad.
Zum Test habe ich mal im Projekt.Provider die System.Net.Http.DLL gelöscht und händisch vom o.G. Pfad wie in den anderen Projekten zugefügt.
Das löst das Problem leider auch nicht...weiß echt nicht mehr weiter.
Die Meldung in der Webanwendung:> Fehlermeldung:
Die Datei oder Assembly "System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" oder eine Abhängigkeit davon wurde nicht gefunden. Die gefundene Manifestdefinition der Assembly stimmt nicht mit dem Assemblyverweis überein.
In der .csproj steht nun:
<Reference Include="System.Net" />
<Reference Include="System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
</Reference>
Setze dann mal <Private>True</Private>
in der Webanwendung (ich denke die System.Net.Http.dll
muß lokal im Deploy-Ordner vorhanden sein).
Hallo 2 Sachen würde ich noch probieren:
Allerletzte Version von Studio installiert? -> Wenn nein -> update
Falls 1. nichts geholfen hat, hilft vllt. ein Assembly Redirect (4.0.0.0 - 4.2.0.0) -> 4.1.1.3
Hallo Schuppsl,
Die 4.2.ér Version scheint nicht von deinem Projekt, sondern von einem BuildTarget referenziert zu sein.
Ja, aber das Problem ist ja: Warum ist das so?
Edit.
Also das verstehe ich nicht:
Ich lösche die System.Net.Http aus den Verweisen.
Dann gehe ich in das Verzeichnis wie bei allen anderen:
C:\Users\MeinUser\Documents\Visual Studio 2017\Projects\MeinProjekt\Projekt.Sort.Solution\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll
Und füge diese aus diesem Verzeichnis hinzu.
Dann steht aber trotzdem wieder die Version 4.2.0.0 mit dem MSBuild Verzeichnis drin (Siehe Ausgangspost)
Wie kann denn das sein?
P.S. VS2017 ist auf dem aktuellsten Stand
Also folgendes habe ich gemacht:
System.Net.Http aus den Verweisen gelöscht.
In der .csproj den Verweis darauf gelöscht
Den Ordner System.Net.Http.4.3.4 im Ordner packages gelöscht.
Per NuGet System.Net.Http installiert.
Die DLL zeigt jetzt zwar immer noch auf das MsBuild Verzeichnis, aber die Version stimmt jetzt und das ganze Läuft jetzt mal....
Der Weg über NuGet ist hier auch der einzig korrekte.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code