Que se passe-t-il si je supprime l’élément SupportRuntime ajouté automatiquement?

J’ai mon objective de projet 4.0. Je l’ai mis à jour en 4.5 et VS ajouté

   

En plus de changer TargetFrameworkVersion et je suis curieux de savoir si c’est redondant. D’après ce que je comprends, si le moteur d’exécution ne trouve pas le supportRuntime, il utilise la version .net utilisée pour créer exe. Donc, dans ce cas, l’exe est construit en utilisant 4.5 et il a également dit d’utiliser 4.5. Se comporterait-il différemment si je l’ai ou non et l’exécute sur une machine qui n’a que 4.0?

La documentation MSDN n’en donne pas de bonnes explications, mais j’ai trouvé un article de Scott Hanselman intitulé ” Versions .NET et multi-ciblage – .NET 4.5 est une mise à niveau sur place vers .NET 4.0 ” qui révèle:

Si vous créez une application client, comme WinForms, Console, WPF, etc., tout est automatique. Votre app.config contient le fait que vous avez besoin de .NET 4.5 et vous serez même invité à l’installer.

Ainsi, l’entrée de configuration concerne tout ce qui se passe si un utilisateur avec .NET 4.0 sur sa machine (mais pas .NET 4.5) tente d’exécuter votre application .NET 4.5. .NET 4.0 et .NET 4.5 sont tous deux basés sur la version 4 du CLR, ils sont donc théoriquement compatibles. mêmes formats binarys et tout ça. La seule différence entre un binary construit contre .NET 4.0 et un binary construit contre .NET 4.5, ce sont les bibliothèques auxquelles ils font référence.

Une application compilée pour .NET 4.5 peut donc être exécutée sur un ordinateur sur lequel seul .NET 4.0 est installé. Cependant, vous obtiendrez une exception d’exécution si vous tentiez d’utiliser des API qui n’existaient pas dans la version 4.0.

Si vous avez cette entrée de fichier de configuration et qu’un utilisateur avec .NET 4.0 tente d’exécuter votre application, l’application ne s’exécutera pas et l’utilisateur sera invité à installer .NET 4.5. (Voir la capture d’écran dans l’article du blog de Scott.) C’est un bon défaut pour la plupart des gens.

Si vous n’avez pas l’entrée de fichier de configuration, un utilisateur avec .NET 4.0 pourra exécuter votre application, mais obtiendra une exception d’exécution si vous essayez d’appeler des méthodes ou d’utiliser des types ajoutés dans 4.5. Ce sera un gros problème pour vous en tant que développeur et pour vos testeurs. Vous ne devriez le faire que si vous avez des exigences spécifiques que votre application doit s’exécuter sur .NET 4.0 et qu’elle doit tirer parti des nouvelles fonctionnalités 4.5 si elles sont présentes (et vous devrez faire attention au traitement des exceptions et aux tests sur les deux versions). ).

Si vous voulez être capable de fonctionner sur .NET 4.0, mais que vous n’avez pas besoin de nouvelles API 4.5, votre vie est beaucoup plus simple: accédez à l’onglet Build des propriétés du projet et ciblez .NET 4.0. Ensuite, le compilateur s’assurera que vous n’appelez aucune API qui n’existait pas en 4.0 et que votre application s’exécutera avec succès sur les ordinateurs .NET 4.0 et .NET 4.5.

Répondre à un commentaire @Dai et aborder le fait que lorsqu’il est exécuté en tant que service Windows, il se peut que vous ne receviez pas d’invite à installer la version spécifiée dans le fichier App.config.

Existe-t-il un moyen de le supprimer, mais appliquez de manière fiable un code d’archivage de version .NET 4.0 vs 4.5?

Voici ce que j’utilise pour m’assurer que le programme en cours s’exécute sur une version .NET Framework donnée, inspirée de Comment détecter à l’exécution que .NET version 4.5 exécute actuellement votre code?

 ///  /// Throws an exception if the current version of the .NET Framework is smaller than the specified . ///  /// The minimum supported version of the .NET Framework on which the current program can run. /// The version to use is not the marketing version, but the file version of mscorlib.dll. /// See File version history for CLR 4.x and/or .NET Framework Versioni (Build pubblicata) for the version to use. ///  /// The current version of the .NET Framework is smaller than the specified . /// The version of the .NET Framework on which the current program is running. public static Version EnsureSupportedDotNetFrameworkVersion(Version supportedVersion) { var fileVersion = typeof(int).Assembly.GetCustomAtsortingbute(); var currentVersion = new Version(fileVersion.Version); if (currentVersion < supportedVersion) throw new NotSupportedException($"Microsoft .NET Framework {supportedVersion} or newer is required. Current version ({currentVersion}) is not supported."); return currentVersion; } 

Exemple d'utilisation pour garantir l'exécution sur .NET 4.6.2:

 var v462 = new Version(4, 6, 1590, 0); EnsureSupportedDotNetFrameworkVersion(v462);