2016-09-08 2 views
0

Ich habe eine Bibliothek erstellt, die ich in einer Portable Class Library sowie einer regulären .NET-Anwendung verwenden kann. Die Art, wie ich dies erreicht ist durch mehrere Lösungen/Projekte erstellen, die auf die gleichen Dateien verweisen:Mehrere Plattformprojekte und NuGet

Src/ 
    Dismissile.sln 
    Dismissile.Portable.sln 
    Dismissile/ 
     Dismissile.csproj 
     Dismissile.Portable.csproj 
     Class1.cs 

Dismissile.sln umfasst Dismissile.csproj und zielt auf .NET Framework 4.5.2 Dismissile.Portable.sln Dismissile enthält. Portable.csproj ist ein tragbares Klassenbibliotheksprojekt, das auf .NET Framework 4.5, Xamarin.Android und Xamarin.iOS abzielt.

Jedes Projekt enthält Class1.cs. Ich habe einige bedingte Kompilierungssymbole in jedem Projekt wie PORTABLE und NET452 erstellt.

Das scheint so gut zu funktionieren, aber jetzt muss ich ein NuGet-Paket für JSON.NET in meine Projekte hinzufügen.

Wenn ich ein NuGet Paket in meinem tragbaren Projekt hinzufügen wird es die folgenden in meinem packages.config erstellen:

<package id="Newtonsoft.Json" version="9.0.1" targetFramework="portable40-net40+sl5+win8+wp8+wpa81" /> 

Allerdings, wenn ich es in meinem anderen Projekt hinzufügen wird es die folgenden in Pakete erstellen. config:

<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net40" /> 

gibt es eine Möglichkeit eine separate packages.config haben, so dass jedes Projekt auf meine NuGet Abhängigkeiten die richtige Referenz enthält?

Antwort

1

Die einfachste Lösung für dieses Szenario besteht darin, für jedes Projekt separate Ordner zu erstellen und die .cs-Dateien über einen Link einzuschließen. (Siehe MSDN - Add as Link)

Doing so können Sie verschiedene Pakete (und Versionen) für verschiedene Plattformen (Projekte) referenzieren, wie Sie -Dateien unterschiedliche packages.config haben.

Zusätzlich sollte ich erwähnen, dass Sie nicht kompatibel Rahmen Methoden auftreten können (wie Task.Factory.StartNew für NET40 und Task.Run für NET45), die auf zwei verschiedene Arten gelöst werden können:

mit Compiler Arbeitskonstanten

definieren einen Rahmen contstant in Ihren Projekten und abfragen sie mit preprocessor-directives, wie:

#if NET40 
Task.Factory.StartNew(...) 
#elif NET45 
Task.Run(...) 
#endif 

mit partiellen Klassen und Methoden

Dismissile.NET40 \ FooClass.cs

public partial class Foo 
{ 
    public void Bar() 
    { 
    // ... 
    this.RunTask(task); 
    } 

    partial void RunTask(Task task); 
} 

Dismissile.NET40 \ Partial.FooClass.cs

public partial class Foo 
{ 
    partial RunTask(Task task) 
    { 
    Task.Factory.StartNew(task); 
    } 
} 

Dismissile.NET45 Arbeiten \ Partial.FooClass.cs

public partial class Foo 
{ 
    partial RunTask(Task task) 
    { 
    Task.Run(task); 
    } 
} 

Zusammenfassung

Meine bevorzugte Lösung ist partielle Klassen und Methoden, wie sie Ihre Quelle mit Verschachtelungen (wegen #if -Aussagen) nicht durcheinander zu tun up, treten beim Debuggen ist viel natürlicher, und schließlich ist dieser Ansatz für komplizierte Szenarien flexibler.

+0

Gibt es irgendwelche Einschränkungen, die ich beachten muss, wenn ich die Dateien als Links hinzufüge? Was kann ich nicht tun? Könnte meine Haupt-.NET-Projektdatei weiterhin in dem Ordner vorhanden sein, in dem sich alle CS-Dateien befinden, und dann nur separate Projekte für die anderen Plattformen erstellen? – Dismissile

+0

Der entscheidende Punkt ist, dass verschiedene Ordner für jede Plattform unterschiedliche * packages.config * -Dateien haben. Es kann Probleme mit Framework-Methoden geben (da ihre Signatur, Verfügbarkeit, ... unterschiedlich sein kann), aber dies kann mit Compiler-Konstanten und '# if'-Anweisungen oder partiellen Klassen gelöst werden, wo Sie Framework-spezifische Implementierungen in einem non bereitstellen Teilklasse. –

+0

Richtig, aber hätten Sie einen separaten Ordner für alle .cs-Dateien ohne Projekt in diesem Ordner, und erstellen Sie dann einen anderen Ordner für die Projektdatei und fügen Sie Links und einen anderen Ordner für das portable Projekt hinzu und fügen Sie Links hinzu, oder würde es in Ordnung, einen Ordner mit den CS-Dateien und ein Projekt ohne Links zu haben, dann einen anderen Ordner für das portable Projekt, das Links verwendet. – Dismissile

Verwandte Themen