Jak sprawdzić obecną w systemie wersję .NET’a?

Większość aplikacji pisanych w .NET, korzysta z funkcji udostępnianych przez ten framework od wersji 4.0, lub starszej. Dlaczego? Zapewne dlatego, że wersja ta zawiera właściwie 90% rzeczy, które są nam do szczęścia potrzebne. Dodatkowym atutem pisania aplikacji w wersji 4.0 tego frameworka, jest fakt, że to ostatnia wersja dostępna dla Windowsa XP. Jednak co w przypadku, kiedy zdecydujemy się porzucić starego XP’ka  i skorzystać z nowych funkcji, jakie wnosi .NET 4.5? Okazuje się, że napotkamy na mały problem… Jaki? Dowiesz się czytając dalej 😉

.NET 4.0, 4.5… a co to za różnica?

Aby w pełnie zobrazować problem, stwórzmy sobie przykładową aplikację WPF przeznaczoną dla .NET’a w wersji 4.5.2. Jest to zresztą wersja domyślna, ustawiana przez Visual Studio dla nowo utworzonych projektów:

aa

W jej kodzie użyjmy funkcji dostępniej, w .NET od wersji 4.5. Będzie to wykonywanie metody asynchronicznej – rzecz o tyle fajna, że kod naszej metody będzie „czekał” na zakończenie się zadania wykonywanego w osobnym wątku, bez zamrażania wątku głównego aplikacji:

private async void button_Click(object sender, RoutedEventArgs e)
{
    await Task.Run(() => MessageBox.Show("Hello!"));
}

Uruchamiamy naszą aplikację pod Visual Studio, póki co wszystko działa tak jak należy:

app

Teraz zaczną dziać się rzeczy dziwne 😉 Aplikacja jest gotowa do użycia, wszystko działa, jednak trafia na komputer z zainstalowanym .NET’em w wersji 4.0. Teoretycznie aplikacja nie powinna się tam w ogóle uruchomić. Czy tak faktycznie będzie? Moje doświadczenie pokazuje, że nie koniecznie…

app45

No okej, aplikacja się uruchomiła i działa. Jednak na wersji starszej, niż ta dla której aplikacja została skompilowana! Sprawdźmy co się stanie, po kliknięciu przycisku, który wywoła funkcję zawartą w .NET 4.5:

app452

Aplikacja się wysypała… W sumie, to było do przewidzenia. Jednak nieświadomy użytkownik nie będzie miał pojęcia o co chodzi. W końcu program się włączył, a tu nagle coś nie działa… Pierwsza myśl: Twórca aplikacji musiał coś popsuć – a problem przecież nie leży w niej.

Co ciekawe, jeżeli w systemie zainstalowana jest wersja 3.5, lub starsza problemu nie ma. Jednak komunikat, który zostanie wyświetlony sugeruje instalację .NET’a 4.0, a nie 4.5…

40

To jednak wyjaśnia, dlaczego aplikacja uruchamia się na systemie z zainstalowanym .NET 4.0, chociaż nie powinna. Czyżby niedopatrzenie zespołu odpowiedzialnego za .NET Framework’a?

Rozwiązanie problemu: Ręczne sprawdzanie obecnej w systemie wersji .NET’a

Jednym rozwiązaniem wyżej przedstawionego problemu jest nie używanie funkcji dostępnych tylko w wersjach 4.5 i wyżej. Wtedy aplikacja przeznaczona dla wersji 4.5, będzie działać na wersji 4.0… Jednak nie po to kompilujemy aplikację dla wersji 4.5, żeby nie używać tego co nam udostępnia… Co w takim razie zrobić? Trzeba po prostu sprawdzić, jaką wersją frameworka dysponuje system, na którym aplikacja jest uruchamiana. Do tego celu, z powodzeniem można wykorzystać poniższą klasę:

using Microsoft.Win32;
using System;

namespace dotNetVersion
{
    class FrameworkVersion
    {
        public static bool GetDotNetVersion()
        {
            using (RegistryKey DNVKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\"))
            {
                int releaseKey = Convert.ToInt32(DNVKey.GetValue("Release"));
                // "4.5 or later";
                if ((releaseKey >= 378389))
                    return true;
                return false;
            }
        }     
    }
}

Sprawdza ona, czy obecny jest w systemie .NET w wersji 4.5 lub nowszej – jeżeli tak, to metoda zwraca wartość true, jeżeli nie to false. Jej użycie jest bardzo proste:

 if (!FrameworkVersion.GetDotNetVersion()){
                MessageBox.Show("Zainstaluj .NET w wersji 4.5 lub nowszej!", "Info", MessageBoxButton.OK, MessageBoxImage.Information);
                Environment.Exit(0);
            }

Ten fragment należy umieścić oczywiście na samym początku kodu naszego programu. W przypadku braku .NET 4.5 w systemie efekt jego działania będzie taki:

msg

Po wyświetleniu informacji program zostaje zamknięty. Dopóki użytkownik nie zainstaluje wymaganego składnika to programu nie uruchomi – i właśnie o to chodzi 😉

Na koniec zachęcam do polubienia fanpage bloga na facebooku, jeżeli jeszcze tego nie zrobiłeś 😉

7,982 total views, 1 views today

2 przemyślenia nt. „Jak sprawdzić obecną w systemie wersję .NET’a?

    • Super, że podesłałeś linka 😉 Cóż, wszelkie informacje trzeba wyciągać z rejestru… Widzę, że twoje rozwiązanie też na tym bazuje. Z tą różnicą, że jest bardziej rozbudowane + sprawdza paczkę z językiem. Jednakże, do rozwiązania problemu opisanego we wpisie, kod przedstawiony przeze mnie powinien w zupełności wystarczyć.

      Pozdrawiam! 🙂

Możliwość komentowania jest wyłączona.