Получить версию ОС в приложении WinRT Metro C#

Я программирую приложение в стиле Metro с помощью С# и бета-версии Visual Studio 11. Теперь я хочу получить OS-версию ОС. Как я могу получить это?

Я узнал, как это сделать в «обычных» приложениях. Там вы берете Environment-Class с атрибутом OSVersion, но в .NET Core этого атрибута нет.


person SwissPrime    schedule 12.04.2012    source источник
comment
Я отправляю его в WebService и там сортирую запросы по версии ОС.   -  person SwissPrime    schedule 12.04.2012
comment
Я не вижу ничего очевидного в документации API, так что, возможно, вы могли бы для начала жестко закодировать его в своей версии приложения Metro?   -  person Tomas McGuinness    schedule 12.04.2012
comment
Умышленно нет возможности узнать версию ОС. Исторически сложилось так, что приложения неправильно использовали версию ОС вместо того, чтобы полагаться на различные формы обнаружения функций, что вызывало серьезные проблемы с совместимостью приложений для команды разработчиков. Для Windows 8 команда разработчиков решила полностью избежать этой проблемы, не предоставляя API GetVersion.   -  person ReinstateMonica Larry Osterman    schedule 12.04.2012
comment
@LarryOsterman - можете ли вы показать пример того, как выполнять обнаружение функций для приложений c#/xaml? нам придется использовать отражение?   -  person Robert Levy    schedule 12.04.2012
comment
В настоящее время нет поддержки языковой проекции для обнаружения функций в C#/Xaml, поскольку существует только одна версия (и, следовательно, доступны все функции). Платформа WinRT поддерживает управление версиями и обнаружение функций, но в языковых проекциях это не реализовано (поскольку нет возможности протестировать их реализацию). Я даже не могу предположить, как будет реализовано обнаружение функций, потому что я не участвую в разработке этих функций.   -  person ReinstateMonica Larry Osterman    schedule 12.04.2012
comment
Управление версиями платформы Winrt работает следующим образом: у каждого типа winrt есть версия, в которой он был представлен. За исключением классов времени выполнения и перечислений, типы winrt неизменяемы. Классы времени выполнения и перечисления могут иметь дополнительную версию, новые записи указывают версию, в которой они были введены. Языковые прогнозы могут использовать эту информацию, чтобы выяснить, какие API и значения доступны в той или иной версии ОС. Как они это делают, зависит от языковой проекции. Выступление Мартина здесь: channel9.msdn.com/ Events/Lang-NEXT/Lang-NEXT-2012/ содержит дополнительную информацию об управлении версиями.   -  person ReinstateMonica Larry Osterman    schedule 12.04.2012


Ответы (4)


Для новых приложений следует проверять определенные функции, а не версию ОС.

Насколько я могу судить, нет необходимости проверять версию ОС, так как приложения Metro доступны только для Win 8.

Изменить. Приложения Store теперь доступны для нескольких версий Windows, но по-прежнему рекомендуется тестировать функции, а не версии ОС. Минимальная версия ОС задается в качестве цели сборки для проекта при его создании.

Изменить №2. Если вы заинтересованы в отслеживании версий ОС в базе установки вашего приложения, вы можете интегрировать Application Insights в свой проект, начиная с приложений, ориентированных на Windows 8.1. Вот руководство по началу работы с ним:

http://azure.microsoft.com/en-us/documentation/articles/app-insights-windows-get-started/

person linkerro    schedule 12.04.2012
comment
Я полагаю, это гарантия будущего. Приложения в стиле Metro, скорее всего, будут работать и в Windows 9. - person svick; 12.04.2012
comment
@svick - Что он собирается делать? Показать сообщение об ошибке при запуске на будущих ОС? Это не гарантия будущего. - person Robert Levy; 12.04.2012
comment
@RobertLevy, как сказал в комментарии ОП, отправьте версию ОС в веб-службу. - person svick; 12.04.2012
comment
Приложения Metro предназначены для изолированной работы и не имеют сведений о базовой операционной системе. Также обновления для WinRT могут выходить вне диапазона. Кроме того, вы должны проверить другие показатели, которые более важны, чем версия ядра Windows (размер экрана, местоположение и т. д.). Насколько нам известно, следующая ОС от MS может даже не быть Windows. - person linkerro; 13.04.2012
comment
Как можно просто так предвидеть, что нет смысла проверять версию ОС? Что, если для статистических целей действительно важно получить точную версию ОС, на которой работает приложение (она не может навсегда оставаться фиксированной на 6.2.9200.0, не так ли?)? Извините, но это не настоящий ответ, это просто покровительственный способ избежать его. - person Gabriel S.; 26.06.2013
comment
Для целей поддержки может быть очень полезно знать, какая версия ОС у кого-то работает. Если вы предоставляете возможность отправить электронное письмо в службу поддержки непосредственно из приложения, полезно встроить в это электронное письмо сведения о версии ОС. - person Ian Griffiths; 23.07.2013
comment
Я признаю, что теперь, когда вышла версия win 8.1, я должен взглянуть и посмотреть, не изменился ли статус-кво. - person linkerro; 23.07.2013
comment
@ГабриэльС. Я залогинился только для того, чтобы проголосовать за вас. Вы не должны делать этот ответ, это не ответ. - person YasharBahman; 13.08.2015

Вы можете получить номер версии ОС с некоторым риском того, что он может быть неправильным, используя API устройств для получения номеров версий драйверов для низкоуровневых системных компонентов.

Принятый ответ правильный в том, что вы не должны привязывать функциональность к номеру версии, но есть веские причины для его использования, такие как аналитика - полезно знать, когда многие ваши пользователи уже используют новую версию, и что вы должны быть рассмотреть возможность обновления приложения, чтобы воспользоваться им.

https://github.com/AttackPattern/CSharpAnalytics/blob/master/Source/CSharpAnalytics/SystemInfo/WindowsStoreSystemInfo.cs содержит дополнительную информацию и пример кода (раскрытие, я написал этот код)

Примечание. Код был обновлен и теперь обрабатывает пользовательские/множественные HAL и т. д.

person DamienG    schedule 03.04.2013
comment
Уверяю вас, что это так, я использую его в CSharpAnalytics и вижу версии ОС для тысяч установок. - person DamienG; 24.06.2013
comment
Тогда вы должны опубликовать свою версию. Мне эта версия не подошла. Но я делаю ошибки. Извиняюсь. - person Jerry Nixon; 25.06.2013
comment
Я просто скопировал код прямо из блога в совершенно новый проект Магазина Windows и вызвал каждый метод из MainPage.xaml.cs. Окно часов показывает, что все работает нормально. Если вы все еще этого не видите, дайте мне знать, что происходит, чтобы мы могли выяснить, связано ли это с какой-то конкретной машиной или нет. - person DamienG; 25.06.2013
comment
Кроме того, этот человек запрашивает информацию о версии ОС, которую вы связали с ответом об архитектуре ЦП. - person DamienG; 25.06.2013
comment
Также только что проверено в Windows 8.1 - правильно возвращает 6.3 в качестве номера версии ОС. (Windows 8 это ядро ​​6.2) - person DamienG; 27.06.2013
comment
Одна хитрость с этим подходом HAL заключается в том, что некоторые машины фактически сообщают о нескольких драйверах HAL. Surface RT сообщит не менее четырех! Две из них имеют тот же номер версии, что и Windows, но две (обе от NVidia) имеют номер версии, начинающийся с 9. - person Ian Griffiths; 24.07.2013
comment
@JerryNixon-MSFT Это работает и для меня, как рекламируется, и ссылка, которую вы дали, предназначена для определения типа процессора. Нам нужен этот код, чтобы определить, следует ли использовать WebView или WebViewBrush, поскольку потребность в WebViewBrush исчезла в версии 8.1 (а в некоторых случаях она полностью сходит с ума при открытии панели приложения). У вас есть решение или это лучшее, на что мы можем надеяться? - person borrrden; 09.08.2013
comment
Исправлена ​​ссылка Куинси. Впоследствии код был обновлен, чтобы не полагаться на HAL, а вместо этого использовать наиболее вероятную версию, основанную на всех драйверах, предоставленных Microsoft. - person DamienG; 08.01.2015
comment
@DamienG, спасибо за пример кода - он отлично работает! У меня единственный вопрос - а как же x86? Похоже, вы отслеживаете только архитектуру x64 или AMD в GetSystemUserAgentAsync(), и я не уверен, что смогу выбрать соответствующий элемент из перечисления ProcessorArchitecture для x86. Любой совет? - person Sevenate; 28.07.2015
comment
Используйте GetProcessorArchitecture в этом образце для непосредственного определения ЦП. GetSystemUserAgent не форматируется для x86, как и браузеры - отсутствие x64 или ARM равно x86 с точки зрения пользовательского агента. - person DamienG; 28.07.2015
comment
Это должен быть ответ. Спасибо! - person Hong; 02.08.2016

На самом деле существует простой способ получить строку версии Windows в форме пользовательского агента (Windows NT 6.x).

Людям, которые задаются вопросом, зачем нам это нужно: собирать статистику о наших пользователях версии Windows и принимать обоснованные решения об обратной совместимости.

public class OsVersion
{
    public static Task<string> GetAsync()
    {
        var t = new TaskCompletionSource<string>();
        var w = new WebView();
        w.AllowedScriptNotifyUris = WebView.AnyScriptNotifyUri;
        w.NavigateToString("<html />");
        NotifyEventHandler h = null;
        h = (s, e) =>
        {
            try
            {
                var match = Regex.Match(e.Value, @"Windows\s+NT\s+\d+(\.\d+)?");
                if (match.Success)
                    t.SetResult(match.Value);
                else
                    t.SetResult("Unknowm");
            }
            catch (Exception ex) { t.SetException(ex); }
            finally { /* release */ w.ScriptNotify -= h; }
        };
        w.ScriptNotify += h;
        w.InvokeScript("execScript", new[] { "window.external.notify(navigator.appVersion); " });
        return t.Task;
    }
person Cyprien Autexier    schedule 19.09.2013
comment
Это только скажет вам, является ли его WP8.1. Он не скажет вам, какой номер сборки ОС, например. находится ли телефон в режиме предварительного просмотра или нет. Для меня очень важно знать, на какой сборке ОС стоит телефон. Ошибки существуют в некоторых сборках, а не в других сборках, я хотел бы сделать отчет об ошибке с указанием номера сборки ОС. - person Quincy; 07.01.2015
comment
Да, это не работает с Windows Phone :), но вопрос был о Windows 8. Я боюсь, что если Microsoft не разрешит нам использовать API-интерфейс версии, у нас не будет лучшего варианта :(. - person Cyprien Autexier; 08.01.2015
comment
Приятно знать, что это должно работать для планшета. В то время вопрос был для win8, но теперь у WP/W8.1 есть универсальные проекты, которые используют весь код. - person Quincy; 08.01.2015
comment
Это не работает. Он всегда возвращает Windows NT 6.2, но у меня Windows 10. - person palota; 27.02.2015
comment
Я не проверял это на Windows 10, но я вам верю. новое ядро ​​должно называться Windows NT 10, но, поскольку оно все еще находится в предварительной версии, возможно, оно не попало в пользовательский агент. Будем надеяться, что в новостях будет альтернатива! Может быть, доступ к переменным среды? Кто знает. - person Cyprien Autexier; 27.02.2015
comment
Вы должны принять решение ниже, которое выглядит как лучший способ сделать это, теперь оно обновлено. - person Cyprien Autexier; 27.02.2015

Судя по ответам других авторов, API для проверки версии ОС отсутствует, но будут API для запроса версии определенного типа. Это означает, что вы, возможно, не сможете определить версию будущих выпусков Windows с вашим текущим кодом, но если вы продолжите обновлять свой код, вы сможете определить версию ОС на основе того, доступен ли конкретный тип. На данный момент вы предполагаете, что используете текущую версию Windows 8.

Кроме того, я не пробовал, но вполне возможно, что вы могли бы получить его, выполнив взаимодействие с JavaScript и проанализировав «navigator.appVersion».

person Filip Skakun    schedule 12.04.2012