web-dev-qa-db-fra.com

Comment cibler netcoreapp2.0 et net461 dans le même projet

J'ai un projet pour lequel je veux utiliser .net core 2.0, que je crois être netcoreapp2.0. Il utilise également un paquet de nugets créé avec .net 4.6.1. J'ai le contrôle de ce paquet de pépites et peux y changer quelque chose si besoin est. Netstandards 2.0 est importé en tant que paquet Nuget.

Si j'inclus dans mon fichier cproj:

    <TargetFramework>netcoreapp2.0</TargetFramework>

Je reçois cet avertissement:

Le package 'Terryberry.Roes.Common 2017.9.29-mongo' a été restauré à l'aide de '.NETFramework, Version = v4.6.1' au lieu du cadre cible du projet '.NETCoreApp, Version = v2.0'. Ce paquet peut ne pas être entièrement compatible avec votre projet.

avec des erreurs sur system.net.sockets en train d'être rétrogradé de 4.3 à 4.1. Le paquet de nuget 4.6.1 a System.Net.Sockets 4.3, donc je ne sais pas pourquoi il veut rétrograder.

L'erreur exacte pour référence:

Déclassement de paquet détecté: System.Net.Sockets de 4.3.0 à 4.1.0. Référencez le package directement à partir du projet pour sélectionner une version différente. MyNetCoreProject (> = 2017.2.0) -> Microsoft.VisualStudio.Web.BrowserLink (> = 1.1.2) -> Microsoft.Extensions.FileProviders.Physical (> = 1.1.1) -> NETStandard.Library (> = 1.6.1) -> System.Net.Sockets (> = 4.3.0) MyNetCoreProject (> = 2017.2.0) -> Microsoft.VisualStudio.Web.BrowserLink (> = 1.1.2) -> System.Net.Sockets (> = 4.1.0) MyNetCoreProject 

J'ai essayé de cibler les deux:

    <TargetFrameworks>net461;netcoreapp2.0</TargetFrameworks>

Cela me donne des avertissements comme:

Le package 'My461NugetPackage' a été restauré à l'aide de '.NETFramework, Version = v4.6.1' au lieu du framework cible du projet '.NETCoreApp, Version = v2.0'. Ce paquet peut ne pas être entièrement compatible avec votre projet.

Cela me trouble aussi parce que maintenant j'ai ajouté net461 et il dit qu'il va le construire avec .NetCoreApp

Il y a encore des erreurs concernant la rétrogradation de System.Net.Sockets

J'ai alors décidé que j'étais disposé à essayer juste net461. Juste pour voir si ça compilerait. C'est le cas, mais j'obtiens une erreur d'exécution.

    <TargetFramework>net461</TargetFramework>

Cela m'a donné:

Exception non gérée: System.TypeLoadException: méthode 'ConfigureAppConfiguration' dans le type 'Microsoft.AspNetCore.Hosting.WebHostBuilder' dans Assembly 'Microsoft.AspNetCore.Hosting, Version = 1.1.2.0, Culture = neutre, PublicKeyToken = adb9793829ddae60' n'a pas de privilège .

J'ai essayé de faire des recherches, mais il y a beaucoup d'informations anciennes/obsolètes à ce sujet, car le noyau .net évolue. Je n'ai pas été capable de comprendre cela. Toute orientation serait appréciée.

5
bgraham

Tout d'abord, vous ne pouvez pas cibler les deux. Ils s'excluent mutuellement. Cependant, ce n'est pas un problème, car vous n'en avez pas besoin.

L'avertissement que vous recevez est fait par dessein. Cela n'empêche pas votre application de fonctionner et n'indique aucun problème. C'est juste que: un avertissement. Cela vous permet de savoir que votre projet .NET Core utilise une bibliothèque qui cible .NET Framework 4.6.1, ce que pourrait causer un problème si et seulement si cette bibliothèque utilise une fonctionnalité de framework particulière qui n'arrive tout simplement pas. être pris en charge par .NET Standard 2.0. Il s'agit simplement de vous informer de ce qui se passe et peut être ignoré en toute sécurité tant que toutes les fonctionnalités de votre application fonctionnent correctement. Si l'avertissement vous dérange, vous pouvez simplement le supprimer.

Cet avertissement apparaît non seulement lors de l'installation du package, mais à chaque fois que vous le créez. Cela garantit que vous ne l'oubliez pas accidentellement.

La raison de l'avertissement est que NuGet n'a aucun moyen de savoir si la bibliothèque .NET Framework fonctionnera réellement. Par exemple, cela peut dépendre de Windows Forms. Pour vous assurer de ne pas perdre votre temps à résoudre des problèmes qui ne fonctionnent pas, NuGet vous informe que vous risquez de ne pas utiliser les rails. Bien sûr, les avertissements que vous devez ignorer sont ennuyeux. Par conséquent, nous vous recommandons de tester votre application/bibliothèque et si vous trouvez que tout fonctionne comme prévu, vous pouvez supprimer l'avertissement.

Source: Annonce .NET Standard 2.0

2
Chris Pratt

Ce n’est pas exactement ce que vous demandez, mais une autre façon de vous en rendre compte consiste à utiliser des bibliothèques partagées.

C'est un peu plus complexe, car vous avez un projet de bibliothèque partagée (contenant uniquement les fichiers de code partagés) et plusieurs autres projets ciblant la plate-forme (par exemple, un pour .net 4.6.1 et un pour .net 2.0 core, etc.). ). L'un des avantages de cette structure est que vous pouvez étendre les projets avec du code spécifique à la plate-forme.

Voir ce dépôt par exemple.

0
JanDotNet