Auparavant , c'était facile, mais Microsoft a décidé d'apporter un changement radical: avant la version 4.5, chaque version de .NET résidait dans son propre répertoire ci-dessous C:\Windows\Microsoft.NET\Framework(sous v1.0.3705, v1.1.4322, v2.0.50727, v3.0, v3.5- répertoires et v4.0.30319).
Depuis la version 4.5, cela a été changé: chaque version de .NET (ie 4.5.x, 4.6.x, 4.7.x, 4.8.x, ...) est installée dans le même sous v4.0.30319- répertoire - vous n'êtes donc plus en mesure de vérifiez la version .NET installée en examinant Microsoft.NET\Framework.
Pour vérifier la version .NET, Microsoft a fourni deux exemples de scripts différents en fonction de la version .NET qui est vérifiée, mais je n'aime pas avoir deux scripts C # différents pour cela. J'ai donc essayé de les combiner en un seul, voici le script que GetDotNetVersion.csj'ai créé (et l'ai mis à jour pour le framework 4.7.1):
using System;
using Microsoft.Win32;
public class GetDotNetVersion
{
public static void Main(string[] args)
{
Console.WriteLine((args != null && args.Length > 0)
? "Command line arguments: " + string.Join(",", args)
: "");
string maxDotNetVersion = GetVersionFromRegistry();
if (String.Compare(maxDotNetVersion, "4.5") >= 0)
{
string v45Plus = GetDotNetVersion.Get45PlusFromRegistry();
if (v45Plus != "") maxDotNetVersion = v45Plus;
}
Console.WriteLine("*** Maximum .NET version number found is: " + maxDotNetVersion + "***");
}
private static string Get45PlusFromRegistry()
{
String dotNetVersion = "";
const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey))
{
if (ndpKey != null && ndpKey.GetValue("Release") != null)
{
dotNetVersion = CheckFor45PlusVersion((int)ndpKey.GetValue("Release"));
Console.WriteLine(".NET Framework Version: " + dotNetVersion);
}
else
{
Console.WriteLine(".NET Framework Version 4.5 or later is not detected.");
}
}
return dotNetVersion;
}
private static string CheckFor45PlusVersion(int releaseKey)
{
if (releaseKey >= 528040) return "4.8 or later";
if (releaseKey >= 461808) return "4.7.2";
if (releaseKey >= 461308) return "4.7.1";
if (releaseKey >= 460798) return "4.7";
if (releaseKey >= 394802) return "4.6.2";
if (releaseKey >= 394254) return "4.6.1";
if (releaseKey >= 393295) return "4.6";
if ((releaseKey >= 379893)) return "4.5.2";
if ((releaseKey >= 378675)) return "4.5.1";
if ((releaseKey >= 378389)) return "4.5";
return "No 4.5 or later version detected";
}
private static string GetVersionFromRegistry()
{
String maxDotNetVersion = "";
using (RegistryKey ndpKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "")
.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
{
foreach (string versionKeyName in ndpKey.GetSubKeyNames())
{
if (versionKeyName.StartsWith("v"))
{
RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName);
string name = (string)versionKey.GetValue("Version", "");
string sp = versionKey.GetValue("SP", "").ToString();
string install = versionKey.GetValue("Install", "").ToString();
if (install == "")
{
Console.WriteLine(versionKeyName + " " + name);
if (String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
else
{
if (sp != "" && install == "1")
{
Console.WriteLine(versionKeyName + " " + name + " SP" + sp);
if (String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
}
if (name != "")
{
continue;
}
foreach (string subKeyName in versionKey.GetSubKeyNames())
{
RegistryKey subKey = versionKey.OpenSubKey(subKeyName);
name = (string)subKey.GetValue("Version", "");
if (name != "")
{
sp = subKey.GetValue("SP", "").ToString();
}
install = subKey.GetValue("Install", "").ToString();
if (install == "")
{
Console.WriteLine(versionKeyName + " " + name);
if (String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
else
{
if (sp != "" && install == "1")
{
Console.WriteLine(" " + subKeyName + " " + name + " SP" + sp);
if (String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
else if (install == "1")
{
Console.WriteLine(" " + subKeyName + " " + name);
if (String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
}
}
}
}
}
return maxDotNetVersion;
}
}
Sur ma machine, il sort:
v2.0.50727 2.0.50727.4927 SP2
v3.0 3.0.30729.4926 SP2
v3.5 3.5.30729.4926 SP1
v4
Client 4.7.03056
Full 4.7.03056
v4.0
Client 4.0.0.0
.NET Framework Version: 4.7.2 ou version ultérieure
*** * Le numéro de version maximum de .NET trouvé est: 4.7.2 ou version ultérieure ****
La seule chose qui doit être maintenue au fil du temps est le numéro de version une fois qu'une version .NET supérieure à 4.7.1 sort - cela peut être fait facilement en modifiant la fonction CheckFor45PlusVersion, vous devez connaître la clé de publication de la nouvelle version, puis vous peut l'ajouter. Par exemple:
if (releaseKey >= 461308) return "4.7.1 or later";
Cette clé de version est toujours la dernière et valide pour la mise à jour Fall Creators de Windows 10. Si vous utilisez toujours d'autres versions (plus anciennes) de Windows, il en existe une autre selon cette documentation de Microsoft:
.NET Framework 4.7.1 installé sur toutes les autres versions du système d'exploitation Windows 461310
Donc, si vous en avez également besoin, vous devrez ajouter
if (releaseKey >= 461310) return "4.7.1 or later";
en haut de la fonction CheckFor45PlusVersion. De même, cela fonctionne pour les versions plus récentes. Par exemple, j'ai récemment ajouté le chèque pour 4.8. Vous pouvez trouver ces numéros de build généralement chez Microsoft.
Remarque: vous n'avez pas besoin d'installer Visual Studio, pas même PowerShell - vous pouvez l'utiliser csc.exepour compiler et exécuter le script ci-dessus, que j'ai décrit ici.
Mise à jour: La question concerne le .NET Framework, par souci d'exhaustivité, j'aimerais également mentionner comment interroger la version de .NET Core - par rapport à ce qui précède, c'est facile: ouvrez un shell de commande et tapez:
dotnet --info Enter
et il répertorie également le numéro de version .NET Core, la version Windows et les versions de chaque DLL d'exécution associée. Exemple de sortie:
.NET Core SDK (reflétant n'importe quel fichier global.json):
Version: 2.1.300
Commit: adab45bf0c
Environnement d'exécution:
Nom du système d'
exploitation: Version du système d'exploitation Windows
: 10.0.15063
Plate-forme du système d'exploitation: Windows
RID: win10-x64
Chemin de base: C: \ Program Files \ dotnet \ sdk \ 2.1.300
Hôte (utile pour le support):
Version: 2.1.0
Validation: caa7b7e2ba
.NET Core SDK installés:
1.1.9 [C: \ Program Files \ dotnet \ sdk]
2.1.102 [C: \ Program Files \ dotnet \ sdk]
...
2.1.300 [C: \ Program Files \ dotnet \ sdk]
.NET Core runtimes installés:
Microsoft.AspNetCore.All 2.1.0 [C: \ Program
Files \ dotnet \ shared \ Microsoft .AspNetCore.All]
...
Microsoft.NETCore.App 2.1.0 [C: \ Program Files \ dotnet \ shared \ Microsoft.NETCore.App]
Pour installer des environnements d'
exécution ou des SDK .NET Core supplémentaires:
https://aka.ms/dotnet-download
Notez que
si vous n'avez besoin que du numéro de version sans toutes les informations supplémentaires, vous pouvez utiliser
dotnet --version.
sur un PC Windows 64 bits , il est possible d'installer la version x86 côte à côte avec la version x64 de .NET Core. Si tel est le cas, vous n'obtiendrez que la version qui vient en premier dans la variable d'environnement PATH. Cela est particulièrement important si vous avez besoin de le maintenir à jour et que vous souhaitez connaître chaque version. Pour interroger les deux versions, utilisez:
C: \ Program Files \ dotnet \ dotnet.exe --version
3.0.100-preview6-012264
C: \ Program Files (x86) \ dotnet \ dotnet.exe --version
3.0.100-preview6-012264
Dans l'exemple ci-dessus, les deux sont identiques, mais si vous avez oublié de mettre à jour les deux instances, vous pourriez obtenir des résultats différents! Notez que Program Filesc'est pour la version 64 bits , et Program Files (x86)c'est la version 32 bits .
Mise à jour: Si vous préférez conserver les numéros de build dans une liste plutôt que dans une cascade d'instructions if (comme Microsoft l'a suggéré), vous pouvez utiliser ce code à la CheckFor45PlusVersionplace:
private static string CheckFor45PlusVersion(int releaseKey)
{
var release = new Dictionary<int, string>()
{
{ 378389, "4.5" },
{ 378675, "4.5.1" }, { 379893, "4.5.2" },
{ 393295, "4.6" },
{ 394254, "4.6.1" }, { 394802, "4.6.2" },
{ 460798, "4.7" },
{ 461308, "4.7.1" }, { 461808, "4.7.2" },
{ 528040, "4.8 or later" }
};
int result = -1;
foreach(var k in release.OrderBy(k=>k.Key))
{
if (k.Key <= releaseKey) result = k.Key; else break;
};
return (result > 0) ? release[result] : "No 4.5 or later version detected";
}
Environment.Version()retourne probablement simplement la version du CLR.