プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

.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の一つだったりします

devblogs.microsoft.com

github.com

こんなのチェックしてないよ!!!


追記(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公開中ですよ

github.com

.NET Core 3.0 ではSocketのKeepAliveのリトライ回数が変更できちゃう!!