102 votes

Comment multi-cibler une bibliothèque de classes .NET Core avec csproj?

Lors de l' .NET de Base toujours utilisé l' project.json format, vous pouvez créer une bibliothèque de classes ciblant de multiples cadres (par exemple, net451, netcoreapp1.0).

Maintenant que le projet officiel format est - csproj à l'aide de MSBuild, comment spécifier plusieurs cadres à la cible? Je suis en train de regarder pour cette partir des paramètres de projet dans VS2017, mais je suis capable de ne cible qu'un seul cadre de l' .NET cadres de Base (il n'a même pas la liste des autres .NET Framework version dont je n' ai installé):

enter image description here

132voto

Aboo Points 366

Vous avez besoin d'ajouter un s à la valeur par défaut TargetFramework et modifier fondamentalement à TargetFrameworks. Ensuite, vous mentionnez le Nom avec un ; séparateur.

Aussi, vous pouvez mettre le package Nuget des références dans un conditionnelle ItemGroup manuellement ou à l'aide de VS Gestionnaire de Package Nuget.

Voici ce que votre .csproj devrait ressembler à:

<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>

Une autre solution je fais ces jours-ci en raison de documents manquants, c'est que je créer un projet dans VS2015 et la forme du projet.json à l'aide de la documentation disponible et intellisense, puis ouvrez la solution dans VS2017 et utilisez la fonction intégrée de mise à niveau. Je vais donc regarder le fichier csproj de comprendre comment faire pour que la configuration se produire.

Multi-ciblage plus ésotérique des cibles sans Nom:

Microsoft:

PCLs ne sont pas recommandés+

Bien que PCLs sont pris en charge, les auteurs du paquet devrait soutenir netstandard à la place. L' .NET Plate-forme Standard est une évolution de PCLs et représente binaire portabilité sur les plates-formes à l'aide d'un seul surnom qui n'est pas lié à une statique comme comme portable-a+b+c monikers.

Si vous souhaitez cibler un Profil Portable, il n'est pas prédéfinie moniker donc Portable Profils ne pouvez pas déduire TargetFrameworkIdentifier, TargetFrameworkVersion, et TargetFrameworkProfile. Aussi un compilateur constante n'est pas définie automatiquement. Enfin, il faut ajouter toutes les références d'assembly aucun n'est fourni par défaut.

Cet Exemple ci-dessous est extrait à partir d'un projet qui a utilisé l' dynamic mot-clé si elle a en outre besoin de l' Microsoft.CSharp de l'assemblée, ainsi vous pouvez voir comment il est références pour des cibles différentes.

<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>

26voto

Night walker Points 576

Vous pouvez modifier manuellement le fichier .csproj pour cela et définir la propriété TargetFrameworks (pas TargetFramework ).

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

Par exemple, voir EFCore.csproj : https://github.com/aspnet/EntityFrameworkCore/blob/951e4826a38ad5499b9ec34566e47c825fa842a/src/EFCore/EFCore.csproj

12voto

Hans Passant Points 475940

J'ai effectivement choisi de la Bibliothèque de classes.NET de Base).

Ce n'est pas le modèle de projet que vous voulez si votre bibliothèque a besoin de travailler sur de multiples plate-forme cible. Avec ce modèle de projet, votre bibliothèque ne peut jamais être utilisé dans un projet qui vise .NETCore. Le PCL bibliothèque approche était à la retraite, vous devez maintenant choisir un .NETStandard.

Vous le faites par le démarrage du projet avec la "Bibliothèque de classes (.NET Standard)" modèle de projet. Vous avez maintenant la possibilité de choisir la .NETStandard version. La compatibilité de la grille est ici.

Espérons qu'ils vont continuer, qui lie l'article à jour. C'est en mutation .NETStandard 2.0 a été cloué vers le bas, mais ne livre pas encore. Ciblée pour le 2ème trimestre de l'année 2017, fin du printemps sans doute, actuellement, il montre que 97% de fait. J'ai entendu les concepteurs de dire que l'utilisation de 1.5 ou 1.6 n'est pas recommandé, pas assez compatible avec 2.0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X