.NET Core 3.0 にしたらWindowsのバージョンが変わった話
釣り気味のタイトルです
無事に .NET Core 3.0 がリリースされたので早速使ってみましょう
コード
Console.WriteLine("Environment.Version\t" + Environment.Version); Console.WriteLine("RuntimeInformation.FrameworkDescription\t" + RuntimeInformation.FrameworkDescription); Console.WriteLine("Environment.OSVersion\t" + Environment.OSVersion);
結果
// .NET Core 2.2 Environment.Version 4.0.30319.42000 RuntimeInformation.FrameworkDescription .NET Core 4.6.27817.03 Environment.OSVersion Microsoft Windows NT 10.0.18362.0 // .NET Core 3.0 Environment.Version 3.0.0 RuntimeInformation.FrameworkDescription .NET Core 3.0.0 Environment.OSVersion Microsoft Windows NT 6.2.9200.0
Windowsのバージョン!!!
これは事前にアナウンスされているBreaking Changesの一つだったりします
こんなのチェックしてないよ!!!
追記(2019/09/26 16:53)
上記2個めのリンクは違う内容だったようです。 詳しくはコメント欄みてください。 本現象の解説まで書いていただいてあります。 コメント必読です。 なんなら本文読まずにコメントだけ読んでください
困ること
例えば Windows 10 1703 で追加された機能を使いたい時なんかは
var version = Environment.OSVersion.Version; if (version.Major > 10 || version.Major == 10 && version.Build >= 15063) { // Windows 10 1703 以降の機能 }
なんて書いたりするわけで、これをそのまま .NET Core 3.0 に持ってくるとメジャーバージョンが6になって if の中に入ってくれなくなります
とりあえず
private Version GetOSVersion() { if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) return Environment.OSVersion.Version; // Windows以外はしらないよ var osDescription = RuntimeInformation.OSDescription.Replace("Microsoft", "").Replace("Windows", "").Trim(); var descriptions = osDescription.Split("."); if (descriptions.Length < 3) return Environment.OSVersion.Version; if (!int.TryParse(descriptions[0], out var major) || !int.TryParse(descriptions[1], out var minor) || !int.TryParse(descriptions[2], out var build)) return Environment.OSVersion.Version; return new Version(major, minor, build); } { var version = GetOSVersion(); if (version.Major > 10 || version.Major == 10 && version.Build >= 15063) //・・・ }
みたいな感じでお茶を濁しましょう、これがいいことなのか悪いことなのかは知りません
こんな感じでお茶を濁して .NET Core 3.0 用を作ったライブラリRxSocket
公開中ですよ
.NET Core 3.0 ではSocketのKeepAliveのリトライ回数が変更できちゃう!!