2015-02-05 8 views
8

Ich habe festgestellt, dass eine App, die auf 4.5 abzielt, eine Assembly mit dem Ziel 4.5.2 laden und ausführen kann - aber ich kann ein solches Setup nicht kompilieren!Wie kann ich eine .NET 4.5-App mit einem Verweis auf .NET 4.5.2 Assembly kompilieren?

Frage: Wie kann ich eine .NET 4.5 App mit einem Verweis auf .NET 4.5.2 Assembly kompilieren?

Experiment Details:

  • MyLib.csproj - Ziele 4.5.2
  • MyApp.csproj - Ziele 4.5, hat Projektverweis auf MyLib.csproj

Das Kompilieren in Visual Studio oder MSBuild schlägt fehl mit:

Warnung MSB3274: Die primäre Referenz "(...) \ MyLib.dll" konnte nicht aufgelöst werden, da sie gegen das Framework ".NETFramework, Version = v4.5.2" erstellt wurde. Dies ist eine höhere Version als das derzeit ausgerichtete Framework ".NETFramework, Version = v4.5".
Fehler CS0246: Der Typ oder Namespace-Name ‚MyLib‘ konnte nicht gefunden werden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis?)

Ich versuchte MyLib getrennt und verweisen seine DLL zu kompilieren, bekam aber die gleiche Kompilierungsfehler.

Allerdings gelang es mir, beide kennen zu laufen:

  • beide Projekte Set bis 4,5, kompilieren, um das Ergebnis zu c kopieren: \ test \ MyApp.exe
  • Stellen Sie beide Projekte 4.5.2 , kompiliere, kopiere das Ergebnis nach c: \ test \ MyLib.dll
  • Run MyApp.exe - läuft ok!

Hintergrund: ich einen Übergang von unserem großen NuGet-Managed Multi-Projekt von .NET 4.5 bis 4.5.2 vor. Die sagt It is a highly compatible, in-place update to the .NET Framework 4, 4.5 and 4.5.1, also habe ich versucht, was passieren würde, wenn wir einige unserer (NuGet-verwalteten) Refs auf 4.5.2 aktualisiert, und nicht aktualisierte Projekte versucht, sie zu konsumieren.

+4

Warum nicht einfach das Ziel ändern 4.5.2? –

+3

Ja, es ist ein sehr ** rückwärts ** kompatibles Update. Nicht weitergeleitet, sie haben kein Update für 4.5 mit allen hinzugefügten Typen und Mitgliedern veröffentlicht. Also würde Ihre App auf der Maschine mit nur 4,5 in Ordnung starten, dann schrumpfen, kiel und stirbt mit einer lausigen Ausnahme, wenn Ihr Code die nicht vorhandenen Mitglieder verwendet. Welches ist die Warnung? Es gibt eher geringe Chancen, dass Sie solche hinzugefügten Mitglieder * tatsächlich * verwenden. Es gibt wenige, so dass es keinen Sinn hatte, 4.5.2 zu targetieren. –

+0

@roryap: Das Beispiel ist natürlich erfunden. Unser Projekt ist groß, mit über 1000 Projekten, die mehrere Lösungen umfassen, und viele produzieren Binärdateien, die über NuGet an andere Lösungen verteilt werden. Also versuche ich, ALLE Verbraucher eines bestimmten Binaries zu aktualisieren, bevor ich die Binärdatei selbst aktualisiere. – Jonathan

Antwort

0

Sie können versuchen, Ihre Bibliothek zu einer .NET Standard Bibliothek anstatt .NET Framework 4.X eins zu machen.

Siehe related thread.

+0

Leichteres Upgrade des Projekts. 4.5 wird nicht einmal mehr unterstützt. Die früheste unterstützte Version ist 4.5.2. Außerdem, um eine .NET Standard-Bibliothek zum Laufen zu bekommen, müsste man die Laufzeit auf eine unterstützte Version trotzdem upgraden –

+0

@ PanagiotisKanavos sicher, aber es kommt darauf an, was benötigt wird. –

0

Für abwärtskompatibel können Sie multi-targeting verwenden. Öffnen Sie die Datei CSPROJ und ändern Sie es wie folgt aus:

<PropertyGroup> 
    <TargetFrameworks>net462;netstandard1.6</TargetFrameworks> 
    <PreserveCompilationContext>true</PreserveCompilationContext> 
    </PropertyGroup> 

Dies ist ein Beispiel für .nuget Paket für zwei Frameworks: net462 und netstandard1.6

Am Gebäude es zwei Ordner mit Bibliotheken schaffen: Rahmen Ihrer App

  • net462
  • netstandard1.6