44 votes

Quelle est la différence entre <TargetFramework> et <RuntimeFrameworkVersion> ?

J'ai le code suivant dans un csproj fichier :

<TargetFramework>netcoreapp1.0</TargetFramework>

Dans le gestionnaire de paquets NuGet, il est indiqué que j'ai Microsoft.NETCore.App version 1.0.5

Maintenant, disons que j'ai le code suivant dans le même fichier. csproj fichier :

<TargetFramework>netcoreapp1.0</TargetFramework>
<RuntimeFrameworkVersion>1.1.4</RuntimeFrameworkVersion>

Le gestionnaire de paquets NuGet indique maintenant que j'ai Microsoft.NETCore.App version 1.1.4

J'essaie essentiellement d'utiliser la dernière version du framework avant .NETCore 2.0 (j'ai eu quelques problèmes avec EF lors de la conversion), c'est-à-dire .NETCore 1.1.4, mais les multiples attributs du framework dans l'onglet csproj me font hésiter sur le choix de l'étiquette à utiliser. Je n'ai pu trouver aucune ressource qui distingue clairement les différences entre les deux.

58voto

Martin Ullrich Points 5894

En TargetFramework est utilisé par NuGet pour résoudre les dépendances et déterminer les actifs à utiliser pour compiler et construire l'application. (Dans les coulisses, quelques autres propriétés telles que TargetFrameworkMoniker et TargetFrameworkVersion entrent en jeu, mais le SDK les abstrait en les simplifiant. TargetFramework pour les cadres qu'il connaît).

En RuntimeFrameworkVersion est spécifique à .NET Core / netcoreapp . Le SDK injectera une dépendance sur Microsoft.NETCore.App pour la version que RuntimeFrameworkVersion est réglé sur ou utiliser la dernière version connue de .NET Core < 2.0. La version résolue est ensuite écrite dans le fichier runtimeconfig.json pour que le résolveur du cadre hôte .NET Core détermine la version du cadre partagé à charger (=> le runtime .NET Core 1.1.4 par exemple).

La raison pour laquelle vous êtes en mesure d'utiliser 1.1.* pour netcoreapp1.0 C'est parce que le paquet NuGet contient effectivement les actifs nécessaires pour construire des applications .NET Core 1.0.*. Cependant, l'outil ne le sait pas et vous obtiendrez une application .NET Core 1.0 mais elle sera chargée par le framework 1.1 car c'est ce qui se trouve dans le paquet NuGet. runtimeconfig.json fichier.

La différence importante est :

  • Il importe seulement pour les exécutables autonomes de savoir quelle version de Microsoft.NETCore.App est utilisé.
    • Ce paquet fournira le cadre complet avec la version souhaitée lors de l'exécution d'une publication autonome (par ex. dotnet publish -r win7-x64 )
    • Lorsque vous exécutez une application construite pour 1.0.3 mais vous avez le 1.0.5 installé, le 1.0.5 sera utilisé automatiquement.
    • Si vous ne définissez pas RuntimeFrameworkVersion et qu'une nouvelle version du SDK est publiée et qu'elle connaît les nouvelles versions de correction de .NET Core, elle utilisera automatiquement la dernière version. Si vous définissez la version explicitement, vous risquez de ne pas être à jour sans modifier le fichier du projet.
  • En RuntimeFrameworkVersion est également le temps d'exécution minimum que l'application chargera - si vous le fixez à 1.0.4 et essayez de l'exécuter sur une machine qui ne dispose que de 1.0.3 installé, l'application ne démarrera pas à moins que vous ne modifiiez le fichier runtimeconfig.json fichier.
  • RuntimeFrameworkVersion peut être défini sur une version flottante, ce qui est utile pour cibler les versions de prévisualisation ou les builds quotidiens, par ex. 2.1.0-preview1-* se résoudrait au plus récent preview1 version disponible sur les flux NuGet configurés.

En dehors de cela, il n'y a que quelques raisons de construire en utilisant une version supérieure de Microsoft.NETCore.App comme une correction de bogue de construction pour le DiaSymReader composant.

Dans la version 2.0 de .NET Core, la version de RuntimeFrameworkVersion sera toujours 2.0.0 pour les "applications portables" (non autonomes), car l'implémentation du cadre n'est plus assurée par les dépendances de l'application Microsoft.NETCore.App et ce paquet NuGet est uniquement utilisé pour fournir des assemblages de référence pour la compilation.

0 votes

Quelle est donc la conséquence réelle d'avoir les deux attributs comme dans mon exemple de code ci-dessus ? Le site RuntimeFrameworkVersion s'impose clairement avec NuGet voit, en prenant la priorité sur la balise TargetFramework étiquette. Pourtant, si j'omets la balise TargetFramework le projet ne se construit pas avec La valeur TargetFramework '' n'a pas été reconnue. Il se peut qu'elle soit mal orthographiée. Dans le cas contraire, les propriétés TargetFrameworkIdentifier et/ou TargetFrameworkVersion doivent être spécifiées explicitement.

2 votes

Le cadre cible spécifie la tranche du paquet qui est utilisée pour la compilation. Ainsi, si vous écrivez foobar1.0 cela ne fonctionnera pas. Aussi, RuntimeFrameworkVersion est spécifique à la netcoreapp cadre cible

0 votes

Cela signifie-t-il que RuntimeFrameworkVersion dans une bibliothèque de classes netstandard2.0 n'a aucun effet, ou que dans une application autonome, cela impose toujours une version d'exécution minimale pour le componnet de la même manière que pour un exécutable ?

1voto

Chris Halcrow Points 907

D'après la documentation, vous devez utiliser runtimeframeworkversion uniquement.

Si vous avez besoin d'une version spécifique du runtime lorsque vous ciblez .NET Core, vous devez utiliser la propriété dans votre projet (par exemple, 1.0.4) au lieu de faire référence au métapackage.

https://docs.microsoft.com/en-us/dotnet/core/tools/csproj

6 votes

RuntimeFrameworkVersion ne doit être utilisé que lorsqu'une version spécifique de l'application Microsoft.NETCore.App est nécessaire. Il n'y a qu'un nombre limité de cas d'utilisation où vous voudriez vraiment faire cela.

3 votes

Si je mets en commentaire ma balise TargetFramework, j'obtiens l'erreur suivante dans ma balise Microsoft.NET.TargetFrameworkInference.targets fichier : "La valeur TargetFramework '' n'a pas été reconnue. Il se peut qu'elle soit mal orthographiée. Si ce n'est pas le cas, alors les propriétés TargetFrameworkIdentifier et/ou TargetFrameworkVersion doivent être spécifiées explicitement "

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