it-swarm.com.de

Wie können Sie eine .NET Core-Klassenbibliothek mit csproj mehrfach ausrichten?

Als .NET Core noch das project.json Format können Sie eine Klassenbibliothek erstellen für mehrere Frameworks (z. B. net451, netcoreapp1.0).

Wie können Sie nun, da das offizielle Projektformat unter Verwendung von MSBuild csproj ist, mehrere Frameworks angeben, auf die abgezielt werden soll? Ich versuche, anhand der Projekteinstellungen in VS2017 danach zu suchen, kann jedoch nur ein einzelnes Framework aus den .NET Core-Frameworks als Ziel auswählen (es werden nicht einmal die anderen vollständigen .NET Framework-Versionen aufgelistet, für die ich muss installiert haben):

enter image description here

76
Gigi

Sie müssen die Projektdatei manuell bearbeiten und s zum Standard TargetFramework und ändern Sie es im Grunde zu TargetFrameworks . Dann erwähnen Sie das Moniker mit einem ; Trennzeichen.

Sie können die Nuget-Paketreferenzen auch manuell oder mithilfe von VS Nuget Package Manager in eine bedingte ItemGroup einfügen.

So sollte Ihr .csproj aussehen:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard1.6;net452</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net452'">
    <PackageReference Include="Microsoft.Azure.DocumentDB">
      <Version>1.12.0</Version>
    </PackageReference>
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.6'">
    <PackageReference Include="Microsoft.Azure.DocumentDB.Core">
    <Version>1.1.0</Version>
    </PackageReference>
  </ItemGroup>
</Project>

Eine andere Problemumgehung, die ich heutzutage wegen fehlender Dokumentation mache, besteht darin, ein Projekt in VS2015 zu erstellen und die Datei project.json mit der verfügbaren Dokumentation und Intellisense zu erstellen, dann die Lösung in VS2017 zu öffnen und das integrierte Upgrade zu verwenden. Ich werde mir dann die csproj-Datei ansehen, um herauszufinden, wie diese Konfiguration durchgeführt werden kann.

Multi-Targeting von mehr esoterischen Zielen ohne Moniker:

Microsoft:

PCLs werden nicht empfohlen

Obwohl PCLs unterstützt werden, sollten Paketautoren stattdessen netstandard unterstützen. Der .NET Platform Standard ist eine Weiterentwicklung der PCLs und stellt die binäre Portabilität über Plattformen hinweg dar, wobei ein einzelner Moniker verwendet wird, der nicht an eine statische Struktur gebunden ist, wie dies bei portablen a + b + c-Monikern der Fall ist.

Wenn Sie ein tragbares Profil als Ziel festlegen möchten, ist kein Moniker vordefiniert, sodass tragbare Profile auch nicht auf TargetFrameworkIdentifier, TargetFrameworkVersion und schließen können TargetFrameworkProfile. Auch eine Compiler-Konstante wird nicht automatisch definiert. Abschließend müssen Sie alle Assembly-Referenzen hinzufügen. Standardmäßig werden keine bereitgestellt.

Das folgende Beispiel stammt aus einem Projekt, in dem das Schlüsselwort dynamic verwendet wurde, sodass zusätzlich die Assembly Microsoft.CSharp Benötigt wurde. Auf diese Weise können Sie sehen, wie die Referenzen für verschiedene Ziele verwendet werden.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard1.5;net40;portable40-net45+sl5+win8+wp8</TargetFrameworks>
  </PropertyGroup>

  <PropertyGroup Condition="'$(TargetFramework)'=='portable40-net45+sl5+win8+wp8'">
    <TargetFrameworkIdentifier>.NETPortable</TargetFrameworkIdentifier>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <TargetFrameworkProfile>Profile158</TargetFrameworkProfile>
    <DefineConstants>$(DefineConstants);PORTABLE158</DefineConstants>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='netstandard1.5'">
    <PackageReference Include="Microsoft.CSharp" Version="4.3.0" />
    <PackageReference Include="System.ComponentModel" Version="4.3.0" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='net40'">
    <Reference Include="Microsoft.CSharp" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='portable40-net45+sl5+win8+wp8'">
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Windows" />
  </ItemGroup>
</Project>
97
Aboo

Sie können die Datei .csproj Manuell bearbeiten und die Eigenschaft TargetFrameworks (nicht TargetFramework) festlegen.

<TargetFrameworks>net451;netstandard1.4</TargetFrameworks>

Beispiel: EFCore.csproj: https://github.com/aspnet/EntityFrameworkCore/blob/951e4826a38ad5499b9b3ec6645e47c825fa842a/src/EFCore/EFCore.csproj

22
Night walker

Ich habe tatsächlich Klassenbibliothek (.NET Core) ausgewählt.

Dies ist nicht die gewünschte Projektvorlage, wenn Ihre Bibliothek auf mehreren Plattformzielen arbeiten muss. Mit dieser Projektvorlage kann Ihre Bibliothek immer nur in einem Projekt verwendet werden, das auf .NETCore abzielt. Der Ansatz der PCL-Bibliothek wurde aufgegeben. Sie müssen jetzt einen .NET-Standard auswählen.

Starten Sie dazu das Projekt mit der Projektvorlage "Class Library (.NET Standard)". Sie haben jetzt die Möglichkeit, die .NETStandard-Version auszuwählen. Das aktuelle Kompatibilitätsraster ist hier .

Hoffentlich werden sie den verlinkten Artikel auf dem neuesten Stand halten. Dies ist im Fluss, .NETStandard 2.0 wurde festgenagelt, wird aber noch nicht ausgeliefert. Geplant für das zweite Quartal 2017, voraussichtlich Ende des Frühlings. Derzeit sind 97% fertig. Ich habe gehört, wie die Designer sagten, dass die Verwendung von 1.5 oder 1.6 nicht empfohlen wird und nicht mit 2.0 kompatibel genug ist

11
Hans Passant

Ich habe ein Anfängerleitfaden für Multi-Targeting-Net Framework und Netcore .

Der einfachste Ansatz ist, zuerst ein Netcore- oder Netstandard-Ziel zum Laufen zu bringen. Bearbeiten Sie dann die csproj-Datei und führen Sie diese Schritte für die anderen Ziele aus.

  1. Erfahren Sie mehr über bedingte Abschnitte in Ihrer csproj-Datei, damit Sie für jedes Ziel unterschiedliche Abhängigkeiten deklarieren können. Erstellen Sie bedingte Abschnitte für jedes Ziel.
  2. Hinzufügen <Reference />s für System. * -Dlls für alle Netframework-Ziele, indem Sie einfach lesen, was in den Buildfehlermeldungen als fehlend angegeben ist.
  3. Umgang mit NuGet-Abhängigkeiten <PackageReference />s in den Fällen, in denen sie nicht für jedes Ziel gleich sind. Der einfachste Trick besteht darin, vorübergehend auf einmaliges Targeting zurückzugreifen, damit die GUI die Nuget-Referenzen für Sie korrekt verarbeitet.
  4. Behandeln Sie Code, der nicht auf allen Zielen kompiliert werden kann, indem Sie eine kreative Vielfalt an Techniken, Problemumgehungen und Zeitersparnissen erlernen.
  5. Wissen, wann Sie Ihre Verluste senken müssen, wenn die Kosten für das Hinzufügen weiterer Ziele zu hoch sind.
2
Chris F Carroll