2017-07-24 10 views
3

Ich versuche, .Net Framework und NetStandard Assemblies miteinander zu kommunizieren (um zu lernen, was möglich ist). Ich habe derzeit vier Projekte, zwei Rahmen 4.5.2 Projekte und zwei NetStandard1.2 Projekte:Referenzieren zwischen NetStandard und .Net Framework

  1. Framework452.Library
  2. NetStandard12.CentralLibrary
  3. NetStandard12.BaseLibrary
  4. Framework452.Tests

Die Referenzierung Struktur ist:

  • Framework452.Tests Referenzen NetStandard12.CentralLibrary: funktioniert durch Hinzufügen der NetStandard.Library Nugget-Paket zu Framework452.Tests.
  • NetStandard12.CentralLibrary Referenzen NetStandard12.BaseLibrary: funktioniert ohne Änderung.
  • NetStandard12.CentralLibrary Referenzen Framework452.Library: Nicht funktioniert, auch wenn Framework452.Library das NetStandard.Library nuget-Paket installiert ist.

Können NetStandard-Projekte auf Framework-Projekte verweisen? Wenn ja, was muss ich tun, damit sie kommunizieren können? Im Moment kann ich die Referenz hinzufügen, aber sie ist für den Code nicht sichtbar.

aktualisieren

neu erstellt ich die Lösung und hinzugefügt, um den Code unten, die, wenn ich versuche, gibt die folgende Fehlermeldung aus dem Framework452.Tests Projekt zu kompilieren:

CS0006 Fehler: Metadaten Datei ‚~ \ TryNETStandard \ NetStandard12.CentralLibrary \ bin \ Debug \ netstandard1.2 \ NetStandard12.CentralLibrary.dll ' konnte nicht gefunden werden.

namespace Framework452.Library 
{ 
    public class Returner452 { 
     public static bool ReturnTrue() { return true; } 
    } 
} 


using Xunit; 
namespace Framework452.Tests 
{ 
    public class Class1 { 
     [Fact] 
     public void FrameworkTest() { 
      Assert.True(NetStandard12.CentralLibrary.Class1.Return452()); 
     } 

     [Fact] 
     public void NetStandardTest() { 
      Assert.True(NetStandard12.CentralLibrary.Class1.Return12()); 
     } 
    } 
} 


namespace NetStandard12.BaseLibrary 
{ 
    public class Returner12 { 
     public static bool ReturnTrue() { return true; } 
    } 
} 


using Framework452.Library; 
using NetStandard12.BaseLibrary; 
namespace NetStandard12.CentralLibrary 
{ 
    public class Class1 
    { 
     public static bool Return452() { return Returner452.ReturnTrue(); } 
     public static bool Return12() { return Returner12.ReturnTrue(); } 
    } 
} 

Antwort

2

Nach dieser Seite https://docs.microsoft.com/en-us/dotnet/standard/net-standard#net-platforms-support Sie sollten in der Lage sein, Ihr Ziel zu erreichen, weil .NET Standard-1.2-Unterstützung .NET Framework 4.5.1 (UPDATE:.. Diese Aussage ist nicht 100% richtig Bitte den Abschnitt Update weiter unten)

Ich habe versucht, in VS 2017 eine Lösung einzurichten und die Referenzen wie beschrieben zu setzen. Hier ist das Ergebnis.

Solution Explorer

und dies ist der Class1.cs in NetStandard12.CentralLibrary

Class1.cs

Der Code ohne Fehler fein kompiliert.

Hinweis: Ihr Code fehlschlagen, wenn die Framework452.Library verwendet eine API, die von .NET Standard-1.2 (zum Beispiel WinForms, Win32-API oder eine proprietäre Microsoft-Bibliothek, die keinen Sinn für Cross-Plattform machen) nicht unterstützt wird.

Ich empfehle diese YouTube-Playlist auf der .NET-Standard Einführung von einem der MSFT https://www.youtube.com/watch?v=YI4MurjfMn8&list=PLRAdsfhKI4OWx321A_pr-7HhRNk7wOLLY

In .NET Standard - Checking Compatibilty, er Werkzeuge empfohlen, dass Sie zu helfen, herauszufinden, was API nicht in .NET-Standard unterstützt wird.

Thing wird mit .NET Standard-einfacher worden 2.0 und 'compat Shim'

UPDATE:

Nach dem Versuch, wieder mit mehr Daten von der Frage zur Verfügung gestellt, es ist wahr, dass eine Bibliothek Targeting (ab) .NET Standard kann nicht von einer Bibliothek abhängen, die auf .NET Framework abzielt. Aus irgendeinem seltsamen Grund erlaubt der Compiler mir, das oben angegebene Beispiel zu kompilieren. Dies könnte ein Werkzeugfehler sein.

Nach ein wenig mehr Forschung, fand ich ein gutes Beispiel, um die Beziehung zwischen NetStandard und NetFramework zu demonstrieren: How .NET Standard relates to .NET Platform. Das Diagramm hier zeigt die Abhängigkeiten Interface Hierarchy Laut dem Diagramm gibt es keine Möglichkeit, eine Bibliothek, die auf .NET Standard ist, konnte die .NET Framework-Implementierung sehen/verwenden.

Wenn .NET Standard 2 veröffentlicht wird, kann sich dies ein wenig ändern und Sie können .NET Framework über Compatibility Shim referenzieren. Sehen Sie dieses Video für ausführlichere Erklärung https://youtu.be/vg6nR7hS2lI?list=PLRAdsfhKI4OWx321A_pr-7HhRNk7wOLLY&t=169

+0

Das Setup, das ich hatte, war das gleiche, und alles, was ich tat, war 'CentralLibrary' Aufruf statische Methoden, die eine' bool' aus 'BaseLibrary' und' zurückgeben würde Bibliothek'. Dann testen Sie diese 'bool's in' Tests'. Ich werde ein bisschen später nochmal darauf eingehen. – Ayb4btu

+0

Verwenden Sie VS 2017? Mit VS 2017, ich glaube nicht, dass Sie Nuget Meta-Paket für netstandard beziehen müssen. Das VS 2017-Toolset sollte die neue Projektdatei im .csproj-Format analysieren und "dotnet restore" automatisch für Sie durchführen. – LxL

+0

Hier ist meine csproj für NetStandard12.CentralLibrary netstandard1.2 LxL

3

Nein, kann .NET-Standard-Projekte nicht Framework Projekte verweisen.

.NET-Standardprojekte müssen plattformübergreifend verwendet werden können, wodurch eine Abhängigkeit vom .NET-Framework erzwungen wird, indem auf eine Assembly verwiesen wird, die darauf abzielt, dies zu verhindern.

Beachten Sie, dass mit einigen der Magie, die Microsoft mit .NET Standard 2.0 tut, dies weniger wahr ist, aber die allgemeine Idee steht immer noch.

Verwandte Themen