Вземете OS-версия в WinRT Metro App C#

Програмирам приложение в стил Metro с C# и Visual Studio 11 Beta. Сега искам да получа OS-версията на OS. Как мога да получа това?

Открих как да го направя в "нормални" приложения. Там взимате Environment-Class с атрибута OSVersion, но в .NET Core няма този атрибут


person SwissPrime    schedule 12.04.2012    source източник
comment
Изпращам го на WebService и там сортирам заявките по OS-Version.   -  person SwissPrime    schedule 12.04.2012
comment
Не виждам нищо очевидно в документацията на API, така че може би бихте могли да го кодирате твърдо във вашата версия на приложението Metro като начало?   -  person Tomas McGuinness    schedule 12.04.2012
comment
Умишлено няма начин да получите версията на ОС. Исторически приложенията са използвали неправилно версията на операционната система, вместо да разчитат на различни форми на откриване на функции, което е причинило значителни проблеми с съвместимостта на приложенията за екипа за разработка. За Windows 8 екипът на разработчиците реши да избегне изцяло проблема, като не предостави GetVersion API.   -  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 има версията, в която е въведен. С изключение на класове по време на изпълнение и enum, типовете winrt са неизменни. Класовете и enum-ите по време на изпълнение могат да бъдат добавяно версионирани, новите записи показват версията, в която са въведени. Езиковите проекции могат да използват тази информация, за да разберат кои API и стойности са налични на коя версия на ОС. Как ще направят това зависи от езиковата проекция. Разговорът на Мартин тук: channel9.msdn.com/ Събития/Lang-NEXT/Lang-NEXT-2012/ съдържа повече информация относно версиите.   -  person ReinstateMonica Larry Osterman    schedule 12.04.2012


Отговори (4)


За нови приложения трябва да проверите за специфични функции, а не за версия на операционната система.

Доколкото мога да преценя, няма причина да проверявате версията на ОС, тъй като metro приложенията са достъпни само за win 8.

Редактиране: Приложенията за магазин вече са налични в множество версии на 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, както OP каза в коментар, изпратете версията на OS до WebService. - person svick; 12.04.2012
comment
Приложенията на Metro са предназначени да работят в силоз и да имат 0 познания за основната операционна система. Също така актуализациите на 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
@GabrielS. Влязох само за да гласувам за вас. Не трябва да правите този отговор не е отговор. - 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 Store и извиках всеки метод от 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

emacs буферен файл отворен ex) d:/documents/test.html ;;работи добре emacs буферен файл отворен ex) d:/documents/my notes/test.html ;;не работи

Не успява поради празното пространство. Можете да прочетете добро описание на това как Bash интерпретира празното пространство тук: https://unix.stackexchange.com/a/108663/84118

- 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 enum за 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. Няма да ви каже какъв е номерът на компилация на ОС, напр. дали телефонът е на dev preview или не. Това е много важно за мен, за да знам на каква операционна система е телефонът. Бъгове съществуват в някои компилации, но не и в други компилации, бих искал да направя доклад за грешка, като посоча номера на компилацията на ОС - person Quincy; 07.01.2015
comment
Да, това не работи с Windows Phone :), но въпросът беше за Windows 8. Опасявам се, че освен ако Microsoft не ни позволи да използваме apis помощник на версията, няма да имаме по-добър вариант :(. - 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, но тъй като все още е предварителна версия, може да не е намерило пътя си до потребителския агент. Да се ​​надяваме, че ще има алтернатива в новинарския apis! Може би достъп до променливи на средата? Кой знае. - 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