tetralobita
tetralobita

Reputation: 455

Windows version shows true value in design, but shows different value when I run program

I am developing a WPF MVVM application to show some Windows System Informations and practice some MVVM.

Somehow in design Environment.OSVersion.ToString() works correctly but after debug it does not. I tried debug and release modes but nothing is changed.

"Microsoft Windows NT 10.0.15063.0" was shown in design time:

"Microsoft Windows NT 6.2.9200.0" was shown in when I run the software:

My UserControl

<UserControl.DataContext>
    <viewModels:WindowsVersionViewModel />
</UserControl.DataContext>
<Grid>
    <TextBox IsReadOnly="True"
             HorizontalAlignment="Left"
             VerticalAlignment="Top"
             Text="{Binding Path=Version, Mode=OneWay}" />
</Grid>

My ViewModel

public class WindowsVersionViewModel : ObservableObject {
    public string Version { get; } = Environment.OSVersion.ToString();
}

How can I get correct version after run and why this happens?

Upvotes: 1

Views: 257

Answers (1)

Matthew Watson
Matthew Watson

Reputation: 109732

This is happening because your application is not manifested for Windows 8.1 or later.

When a non-manifested application makes a call to GetVersionEx(), that function will return the version number of Windows 8.0 if it is run on later versions of the OS.

To fix this you need to manifest your application for the versions of Windows that you want to support.

To do so, you need to add something to you application's app.manifest in the "compatibility" section.

For example:

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!-- A list of the Windows versions that this application has been tested on and is
           is designed to work with. Uncomment the appropriate elements and Windows will 
           automatically selected the most compatible environment. -->

      <!-- Windows Vista -->
      <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->

      <!-- Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />

      <!-- Windows 8 -->
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />

      <!-- Windows 8.1 -->
      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />

      <!-- Windows 10 -->
      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
    </application>
</compatibility>

The reason this works in the designer is because Visual Studio is manifested for Windows 10, and the call to get the version number is being made in the context of Visual Studio.

Upvotes: 4

Related Questions