Posted on 2. February 2019

Windows Template Studio - Версия 3.0!

Microsoft очень рады объявить о выпуске Windows Template Studio 3.0!

Ваши отзывы и пожаления очень важны для сообщества. Если Вы заинтересованы, пожалуйста, перейдите на страницу WTS на Github.

Что нового:

Полный список изменений в версии 3.0 Вы можете просмотреть на странице WTS на Github.

Включено в эту версию:

  • Код теперь генерируется как многопроектное решение. Это позволит лучше повторно использовать и разделять логику кода. В результате это будут UWP и .NET Core проекты.
  • Добавление новых проектов по щелчку правой кнопкой мыши.
  • Горизонтальная навигация просмотра заменена шаблоном навигации Pivot.
  • Обновление MVVMLight для использования библиотеки .NET Standard.
  • Общие исправления ошибок.

Обновления платформы разработки:

  • AdaptiveCards к версии 1.1.2
  • AppCenter.Analytics к версии 1.12.0
  • AppCenter.Crashes к версии 1.12.0
  • Services.Store.Engagement к версии 10.1810.16002
  • UI.Xaml to v2.0.181018003.1
  • Json к версии 12.0.1
  • UI.for.UniversalWindowsPlatform к версии 1.0.1.3
Известная проблема
  • В предварительном просмотре Visual Studio 2019 с поддержкой для нескольких проектов произошел сбой NuGet ссылки для Core проекта. (#2862). Чтобы обойти эту проблему, Вам нужно добавить ссылку вручную. Единственная важная ссылка - это Newtonsoft.Json в Core.
  • Форма отправки обратной связи была удалена, пока ошибка не будет исправлена в SDK (#2879).
Как получить обновление:

Есть две возможности обновления к новой сборке.
  • Уже установлено: Visual Studio автоматически обновляет расширение. Для принудительного обновления, откройте «Инструменты» --> «Расширения и обновления». Затем перейдите на вкладку слева «Обновление расширителя», там Вы увидите «Windows Template Studio», после чего нажмите «Обновить».
  • Не установлено: Перейдите на https://aka.ms/wtsinstall, нажмите «загрузить» и дважды щелкните по VSIX установщику.
Что будет в следующих версиях?

Microsoft ценит Ваше участие и поддержку в сообществе. Кроме того, на данный момент ведется активная работа над новыми функциями, которые будут добавлены в будущих обновлениях. Вот некоторые из них:
  • Шаблон навигации в стиле Menubar (версия 3.1)
  • Идентификационный логин (версия 3.1)
  • Улучшения поддержки для Visual Studio 2019
  • Добавление Azure функций (версия 3.1 и выше)
  • Группа тестовых проектов
В партнерстве с сообществом, Microsoft продолжит работу над добавлением и улучшением функций и функциональности. Команда Windows Template Studio всегда рада Вашим отзывам, и если Вам интересно, пожалуйста, перейдите на GitHub --> https://aka.ms/wts. Если у Вас есть идеи по добавлению новых функций, пожалуйста, отправьте Ваш запрос!



Posted on 31. January 2019

Объявляется Project Rome SDK для Android и iOS версии 1.0

Microsoft рады сообщить о выпуске Project Rome SDK для Android и iOS версии 1.0

Project Rome - Это платформа, которая обеспечивает беспроблемным взаимодействием между различными устройствами и платформами. Философия Project Rome довольно проста. Опыт использования приложений, равно как и данные не должны быть привязаны к одному устройству. Ваши приложения, как и Ваши данные, должны всегда перемещаться с Вами.

Начнем!

Чтобы начать работу с SDK, перейдите по ссылке на документацию Project Rome.

 

Источник



Posted on 28. January 2019

Больше возможностей с шаблонами в C# 8.0

Больше возможностей с образцами в C# 8.0

Вышел второй предварительный просмотр Visual Studio 2019! Наряду с ним были разработаны дополнительные C# 8.0 функции. В основном в данной статье речь пойдет о новых образцах, хотя в конце также будут рассмотрены другие новости и изменения.

Еще больше образцов

Когда в C# 7.0 была добавлена поддержка образцов, Microsoft объявили, что собираются добавить еще больше образцов в большем количестве знаков. Это время настало! Добавляются так называемые рекурсивные образцы, а также более компактная форма оператора switch выражений, называемых (как Вы уже догадались) switch выражениями.

Вот простой пример образцов C# 7.0:

class Point
{
    public int X { get; }
    public int Y { get; }
    public Point(int x, int y) => (X, Y) = (x, y);
    public void Deconstruct(out int x, out int y) => (x, y) = (X, Y);
}

static string Display(object o)
{
    switch (o)
    {
        case Point p when p.X == 0 && p.Y == 0:
            return "origin";
        case Point p:
            return $"({p.X}, {p.Y})";
        default:
            return "unknown";
    }
}

Switch выражения

Следует отметить, что многие switch выражения на самом деле не выполняют в case основах ничего особенного. Часто они просто создают значение, либо присваивая его переменной, либо возвращая его (как указано выше). Во всех этих случаях switch выражение выглядит довольно неуклюже и напоминает язык пятидесятилетней давности, очень церемонный и громоздкий.

Поэтому пришло время добавить форму выражения switch. См. пример:

static string Display(object o)
{
    return o switch
    {
        Point p when p.X == 0 && p.Y == 0 => "origin",
        Point p                           => $"({p.X}, {p.Y})",
        _                                 => "unknown"
    };
}

Ниже приведены отличия от switch операторов:

  • Ключевое слово switch – это «infix» между проверенным значением и {...} списком случаев. Это делает данное слово более совместимым с другими выражениями, а также позволяет отличить его визуально от switch оператора.
  • Ключевое слово case и «:» символ для краткости были заменены лямбда-стрелкой =>.
  • Default значение для краткости было заменено _ шаблоном сброса.
  • Атрибуты bodies – это выражения! Результат выбранного атрибута становится результатом switch выражения.

Поскольку выражение должно иметь значение или выдавать исключение, то switch выражение, которое доходит до конца без совпадений, генерирует исключение. Компилятор предупреждает, когда это может произойти, но не заставляет останавливать все switch выражения с помощью catch-all сервиса: ведь Вы знаете лучше!

Теперь, когда Display метод состоит из только одного return оператора, можно упростить его до состояния выражения:

static string Display(object o) => o switch
    {
        Point p when p.X == 0 && p.Y == 0 => "origin",
        Point p                           => $"({p.X}, {p.Y})",
        _                                 => "unknown"
    };

Этот путь более лаконичный и понятный, ведь, как указано выше, именно краткость позволяет форматировать «табличным» способом switch, с шаблонами и телами на одной линии, где => выстроились друг под другом.

Microsoft планирует разрешить использование «,» запятой после последнего кейса в соответствии со всеми другими «разделенными запятыми списками в фигурных скобках» в C#, но во втором предварительном просмотре Visual Studio 2019 осуществить это пока нельзя.

Образцы свойств

Затрагивая тему лаконичности, следует отметить, что шаблоны внезапно становятся самыми тяжелыми элементами switch выражений. Но данный вопрос вполне решаем.

Обратите внимание, что switch выражение использует Point p тип шаблона (дважды), а также when предложение для добавления дополнительных условий для первого case.

 В C# 8.0 Microsoft добавляет дополнительные необязательные элементы в тип образца, что позволяет самому образцу углубиться в значение сопоставляемого шаблона. Его можно сделать шаблоном свойства, добавив {...}, который содержит вложенные шаблоны, для применения к доступным свойствам или полям значения. Это позволяет переписать switch выражение следующим образом:

static string Display(object o) => o switch
{
    Point { X: 0, Y: 0 }         p => "origin",
    Point { X: var x, Y: var y } p => $"({x}, {y})",
    _                              => "unknown"
};
Оба случая все еще проверяют, что o является Point. В первом случае 0 шаблон константы применяется рекурсивно к X и Y свойствам переменной p, проверяя, есть ли у них это значение. Таким образом, when условие может быть исключено в данном и многих распространенных случаях.

Во втором случае var шаблон применяется к каждому из X и Y. Стоит напомнить, что выполнение var шаблона в C# 7.0 всегда завершается успешно и просто объявляет новую переменную для хранения значения. Таким образом, x и y содержат значения int для p.X и p.Y.

p никогда не используется, а значит, фактически его можно опустить и здесь:

Point { X: 0, Y: 0 }         => "origin",
    Point { X: var x, Y: var y } => $"({x}, {y})",
    _                            => "unknown"
То, что остается верным для всех типов образцов, включая образцы свойств, – это их ненулевое значение. Благодаря чему становится возможным использование «пустого» {} свойства образца в качестве компактного «ненулевого» шаблона. Например, запасной вариант можно заменить следующими двумя двумя кейсами:

{}                           => o.ToString(),
    null                         => "null"

Позиционные образцы

Образец свойств не совсем укорачивает второй Point кейс, но в данном случае можно сделать многое.

Обратите внимание, что у Point класса есть Deconstruct метод, так называемый deconstructor. В C# 7.0 деконструкторы позволяли деконструировать значение при присваивании, чтобы можно было написать код такого плана:

(int x, int y) = GetPoint(); // split up the Point according to its deconstructor
В C# 7.0 деконструкция с использованием образцов интегрирована не была. Это меняется с позиционными образцами, которые являются дополнительным способом расширения шаблонов типов в C# 8.0. Если совпавший тип является типом кортежа или у него есть деконструктор, то можно использовать позиционные шаблоны как компактный способ применения рекурсивных шаблонов без необходимости называть свойства:

static string Display(object o) => o switch
{
    Point(0, 0)         => "origin",
    Point(var x, var y) => $"({x}, {y})",
    _                   => "unknown"
};

Как только объект сопоставлен с Point, применяется деконструктор, а вложенные шаблоны применяются к результирующим значениям.

Использование деконструкторов не всегда уместно. Их следует добавлять только к тем типам, где значения объяснимы и бесспорны. Например, для Point класса первое значение – X, а второе – Y очевидны, поэтому приведенное выше switch выражение интуитивно понятно и легко читается.

Образцы кортежей

Очень полезный особый случай позиционных образцов – их применение к кортежам. Если switch оператор применяется непосредственно к выражению кортежа, то разрешено опустить дополнительный набор скобок, как в switch (x, y, z) вместо switch ((x, y, z)).

Шаблоны кортежей отлично подходят для одновременного тестирования нескольких входных данных. Ниже приведена простая реализация стейт-машины:

static State ChangeState(State current, Transition transition, bool hasKey) =>
    (current, transition) switch
    {
        (Opened, Close)              => Closed,
        (Closed, Open)               => Opened,
        (Closed, Lock)   when hasKey => Locked,
        (Locked, Unlock) when hasKey => Closed,
        _ => throw new InvalidOperationException($"Invalid transition")
    };

Конечно, можно было бы добавить hasKey во включенный кортеж вместо использования when предложений, но это действительно вопрос вкуса:

static State ChangeState(State current, Transition transition, bool hasKey) =>
    (current, transition, hasKey) switch
    {
        (Opened, Close,  _)    => Closed,
        (Closed, Open,   _)    => Opened,
        (Closed, Lock,   true) => Locked,
        (Locked, Unlock, true) => Closed,
        _ => throw new InvalidOperationException($"Invalid transition")
    };

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

Другие функции C# 8.0 во Втором Предварительном Просмотре

Несмотря на то, что во втором предварительном просмотре VS 2019 основные функции для работы с образцами являются наиболее важными, есть несколько более мелких особенностей, которые не менее полезны и интересны. Ниже приведено краткое описание каждой.

Using объявления

В C# using операторы всегда приводят к вложенности, что может сильно раздражать и ухудшать читабельность. Для простых случаев, когда нужно, чтобы ресурс был очищен в конце области, теперь используются using объявления. Using объявления – это объявления локальных переменных с ключевым словом using в начале, где их содержимое располагается в конце текущего блока операторов. Так что вместо:

static void Main(string[] args)
{
    using (var options = Parse(args))
    {
        if (options["verbose"]) { WriteLine("Logging..."); }
        ...
    } // options disposed here
}

Можно написать следующее

static void Main(string[] args)
{
    using var options = Parse(args);
    if (options["verbose"]) { WriteLine("Logging..."); }

} // options disposed here
Disposable ref структуры

Ref Структуры были введены в C# 7.2, полезные функции которых были рассмотрены в других статьях. Стоит отметить, что они накладывают некоторые серьезные ограничения, такие как невозможность реализации интерфейсов. Ref структуры теперь доступны без реализации Idisposable интерфейса, просто с помощью Dispose метода.

Статические локальные функции

Чтобы убедиться, что выполнение локальной функции не забирает много времени, связанного с «захватом» (ссылками) переменных из охватывающей области, можно объявить ее как static. Тогда компилятор устранит ссылку на все, что объявлено во вложенных функциях, кроме других статических локальных функций.

Изменения с момента выпуска Первого Предварительного Просмотра

Основными функциями Первого Предварительного Просмотра были обнуляемые ссылочные типы и асинхронные потоки. Обе версии были немного изменены во Втором Выпуске, поэтому перед началом использования полезно знать следующее.

Обнуляемые ссылочные типы

Microsoft добавили больше опций для управления пустыми предупреждениями как в источнике (через #nullable и #pragma warning директивы), так и на уровне проекта. Также была изменена подписка на файл проекта к enable .

Асинхронные потоки

Microsoft изменила форму IAsyncEnumerable интерфейса, которую ожидает компилятор. Это приводит к тому, что компилятор не синхронизируется с интерфейсом, предусмотренным в .NET Core 3.0 Preview 1, что может привести к некоторым проблемам. Однако планируется выпуск .NET Core 3.0 Preview 2, который вернет синхронизацию интерфейсов.

Обратите внимание

Microsoft ждет Ваших отзывов! Попробуйте новые особенности. 


 




Posted on 16. January 2019

Выпущены WebRTC UWP и образец callstats.io интеграции

В прошлом году Microsoft объявили о поддержке связи в режиме реального времени на универсальной Windows платформе, которая разработана на развилке Google WebRTC.org репозитория. Проект позволяет UWP разработчикам создавать совместимые с Chrome и похожие по функциям RTC приложения для всех Windows 10 платформ, включая настольные ПК, ноутбуки с HoloLens, Xbox и ARM поддержкой. Интерес общества к проекту увеличивается, о чем говорит 26 тысяч NuGet загрузок и сотни писем от разработчиков на GitHub и на почте. WebRTC и ORTC UWP были значительно улучшены, и Microsoft сообщили о своем вкладе в UWP поддержку репозитория Google WebRTC.org – более подробная информация будет опубликована в ближайшие месяцы.

Однако, постоянно поступает просьба от разработчиков, которые хотят лучше понять качество WebRTC вызовов для своих приложений. Это может быть звонок из HoloLens в десктопный браузер или Xbox приложение потокового видео в реальном времени. С этой целью Microsoft сотрудничает с callstats.io, чтобы обеспечить портативную .NET интеграцию платформы для WebRTC сервисов мониторинга и статистики!

Сегодня Microsoft объявили о выпуске NuGet .NET Standard 2.0 пакета для callstats.io, наряду с образцом кода на основе исходного кода PeerCC UWP. В качестве .NET Standard библиотеки, он доступен для всех поддерживаемых .NET реализаций, включая .NET Framework, .NET Core, UWP, Xamarin и Unity платформы (ознакомьтесь с документацией по требованиям к версии). Образец PeerConnection представляет собой UWP приложение, которое устанавливает двухсторонний видеовызов и отправляет WebRTC статистику в callstats.io службу с 10-секундными интервалами.

Пример приборной панели, показывающей статистику для всего сервиса:

Kognitiv Spark, лидер в области систем со смешанной реальностью и Windows 10 разработчик, использует callstats.io сервис со своим RemoteSpark приложением.

«Наша операционная команда столкнулась с вопросами, помогающими клиентам решить трудности с сетью, которые могут нарушить сеанс смешанной реальности», – говорит Райан Грум, соучредитель и технический директор Kognitiv Spark. «Благодаря встроенной поддержке Windows 10 мы смогли за несколько часов запустить callstats.io службу и начать использовать полные данные, доступные на ее панели, для обнаружения и решения проблем».

Ознакомьтесь с шагами для интеграции.

1) Создать учетную запись callstats.io.

  • Перейдите по ссылке https://dashboard.callstats.io/register и создайте Организацию.
  • Перейдите на вкладку приложений, чтобы создать приложение, и ввести SDK как другой «UWP».
  • Нажмите на левой боковой панели «Настройки приложения» и перейти на вкладку «Безопасность».
  • Нажмите «Новые учетные данные» и выберите ярлык ключа.
  • Выберите тип ключа как «ECDSA» и введите открытый ключ.
  • Под ключевыми деталями, нажмите на «вид» для учетных данных.
2) Для аутентификации с помощью callstats.io необходимо сгенерировать криптографические ключи и загрузить открытый ключ в сервис. С инструкциями в файле readme.md можно ознакомиться здесь. После выполнения этого шага в проекте должны получиться Config класс и .p12 сертификат. Это все, что необходимо для аутентификации в API REST callstats.io.

3) Перейдите по ссылке на NuGet Org.WebRtc.Callstats пакет, доступный в Вашем проекте здесь.

4) Если используется образец PeerCC, то можно найти классы для сбора данных из PeerCC и WebRTC в Stats папке, также можно использовать этот код в качестве примера для своей реализации. Добавлять файлы из папки PeerCC-Sample репозитория в проект нужно следующим образом:
  • PeerConnectionControllerStateChange.cs: отслеживает RTCPeerConnection изменения состояния и собирает данные о состояниях одноранговых соединений для отправки в callstats.
  • StatsController.cs: собирает данные из всего PeerCC семпла и использует Org.WebRtc.Callstats библиотеку для отправки подготовленных данных в REST API callstats.io.
  • WebRtcStats.cs: подготавливает статистику, полученную из RTCPeerConnection, для связи с callstats.io через REST API.
5) Инициализируйте callstats.io сервис и отправьте SDP и ошибки приложения через StatsController. Для примера, см. Conductor.cs в PeerCC-Sample.

6) Обработайте изменения ICE состояния в RTCPeerConnection и используйте PeerConnectionStateChange для отправки данных на сервис:

_peerConnection.OnIceGatheringStateChange += async() => 
 
            { 
 
                await PeerConnectionStateChange.StatsOnIceGatheringStateChange(_peerConnection); 
 
                Debug.WriteLine("Conductor: Ice connection state change, gathering-state=" + _peerConnection.IceGatheringState.ToString().ToLower()); 
 
            }; 
 
            _peerConnection.OnIceConnectionStateChange += async () => 
 
            { 
 
                if (_peerConnection != null) 
 
                    await PeerConnectionStateChange.StatsOnIceConnectionStateChange(_peerConnection); 
 
                else
 
                { 
                    await PeerConnectionStateChange.PeerConnectionClosedStateChange(); 
 
                    ClosePeerConnection(); 
 
                } 
 
};
7) Отправьте события уровня приложения для отключения и включения звука в StatsController. Для примера см. MainViewModel.cs в PeerCC-Sample.

Теперь образец должен быть полностью подключен к callstats.io сервису и готов к тестированию. Microsoft только начинает улучшать качество вызовов. В дальнейшем работа будет сфокусирована на усовершенствовании взаимодействия с пользователями с помощью дополнительных метрик и AI. Отправляйте Ваши фидбеки об использовании библиотеки, а также отзывы и предложения на GitHub или на email.

 



Posted on 23. December 2018

.NET производительность в предварительной версии Visual Studio 2019

Наверняка Вы уже слышали о выпуске предварительного просмотра Visual Studio 2019. В этой статье будут рассмотрены улучшения для .NET разработчиков, которые затронули в первую очередь производительность. Полный список изменений можно найти здесь.

Поддержка Языка Regex

У постоянных выражений файлов в C# или Visual Basic теперь есть подсветка синтаксиса, диагностика компилятора и исправления кода. Эта поддержка синтаксического анализа распознает строки, переданные в regex конструктор, и строки, непосредственно предшествующие комментарию, содержащему строку `language=regex`. В этот выпуск включены следующие функции языка: классификация, сопоставление скобок, подсветка ссылок и диагностика компилятора.

Экспорт настроек редактора в Editorconfig

Теперь можно экспортировать настройки редактора в Editorconfig файл через Сервис> Параметры> Текстовый редактор> C#> Стиль кода с помощью кнопки «Создать .editorconfig файл, используя настройки».

Исправления и Рефакторинги Кода

В первом предварительном просмотре Visual Studio 2019 были добавлены несколько наиболее востребованных исправлений и рефакторингов кода. Рефакторинг и быстрые действия доступны с помощью горячих клавиш (Ctrl +.) или (Alt + Enter).

Foreach цикл для LINQ запроса

Foreach циклы к LINQ запросам или LINQ методам теперь объединяются с другими параметрами рефакторинга цикла, включая преобразование LINQ в Foreach цикл, For в Foreach цикл и Foreach в For цикл.


Добавление «Using» оператора к copy/paste


Преобразование анонимного типа в класс


Преобразование локальной функции в метод


Более новые исправления кода и рефакторинги:
  • Преобразование кортежа в именованную структуру.
  • Анализ мертвого кода неиспользуемых закрытых элементов с необязательным исправлением кода для удаления объявления неиспользованного элемента.
  • Создание метода деконструкции.
  • Добавление «await» там, где это подразумевается, но где нет предупреждения компилятора.
Ознакомиться со всеми исправлениями кода и рефакторингами для .NET можно здесь.

Индикатор работоспособности документа

Индикатор работоспособности документа позволяет просматривать все изменения в одном месте. Благодаря ему можно узнать, есть ли в открытом файле ошибки стиля кода или предупреждения. Также данный инструмент позволяет легко и быстро переходить к ним. В правом нижнем углу редактора кода появляется индикатор, который облегчает доступ к настройкам стиля кода и запуску очистки кода.

«Find All» ссылки и поддержка CodeLens Razor

«Find All» ссылки (Shift-F12) и CodeLens отображают результаты из Razor (.cshtml) файлов в .NET Core проектах. Теперь Вы можете перейти к указанному коду в соответствующих Razor файлах.

Запуск тестов из Solution Explorer

Чтобы запустить или отладить тесты, можно просто щелкнуть правой кнопкой мыши на тестах, тестовых классах или тестовых проектах в Solution Explorer.

Попробуйте, как работает предварительный просмотр, оставляйте Ваши отзывы или вопросы о Visual Studio. В этом блог посте Вы можете изучить еще больше информации, а также посмотреть видео о других функциях Visual Studio 2019 Preview 1.

 



Posted on 22. December 2018

Ознакомление с Project Mu

Команда Microsoft Devices Team объявляет о выпуске Project Mu, версии с открытым исходным кодом на базе Unified Extensible Firmware Interface (UEFI) ядра, основанного на Microsoft продуктах, включая Surface и последние версии Hyper-V. UEFI – это системное программное обеспечение, которое инициализирует оборудование во время процесса загрузки и предоставляет сервисы для загрузки операционной системы. Project Mu предоставляет собой множество UEFI функций, предназначенных для современных ПК под управлением Windows. Он также показывает структуру кода и процесс разработки для эффективного использования масштабируемой и надежной прошивки. Эти изменения позволяют Project Mu устройствам поддерживать микропрограмму в виде (FaaS) сервиса. Схожая по своей сути «Windows как сервис», «Прошивка как сервис» оптимизирует UEFI и другие системные прошивки для своевременных исправлений качества, которые обновляют прошивку и обеспечивают эффективную разработку функций сразу после запуска.

Использование встроенного программного обеспечения в качестве открытого источника

При первом включении FaaS в Surface было обнаружено, что TianoCore реализация с открытым UEFI исходным кодом не была оптимизирована для быстрого обслуживания для нескольких линейек продуктов. Были проведены несколько итераций продукта на FaaS, а в результате опубликован бесплатный проект с открытым исходным кодом - Project Mu!

Функции проекта

Project Mu включает в себя:

  • Структуру кода и процесс разработки, оптимизированный под прошивку как сервис.
  • Экранную клавиатуру.
  • Безопасное управление UEFI настройками.
  • Повышенную безопасность за счет удаления ненужного устаревшего кода; практика, которая используется для уменьшения зоны атаки.
  • Высокоэффективную загрузку.
  • Примеры современного BIOS меню.
  • Многочисленные тесты и инструменты для анализа и оптимизации качества UEFI.

Материал для ознакомления с документацией и кодом Project Mu Вы найдете по ссылке: https: //microsoft.github.io/mu/ 



Posted on 20. December 2018

Упаковка .NET Core приложения с помощью Desktop Bridge

Windows Desktop Bridge - это способ упаковки десктопных приложений для отправки в Microsoft Store или загрузки с любого ресурса. Это один из путей создания MSIX пакета. Вкратце: пользуйтесь им, как современным ClickOnce. Это формат упаковки с поддержкой автоматического обновления и пользователи уверены, что он не нанесет вред их системе и не загрязнит реестр.

Ранее Microsoft объявили о первых предварительных .NET Core 3 и Visual Studio 2019 версиях. Эти пробные варианты поддерживают создание графических ПК приложений с помощью .NET Core с использованием WPF и Windows Forms. Можно перенести существующее приложение из .NET Framework в .NET Core 3. Приложение, которое уже переключилось, – это NuGet Package Explorer; его открытый исходный код уже доступен на GitHub и служит отличным примером.

Если у Вас есть приложение, ориентированное на .NET Core 3, то у Вас могут возникнуть вопросы: «Как мне поделиться этим с моими пользователями?», «.NET Core 3 совершенно новый, у моих пользователей этого не будет!» «Мой IT-отдел не будет выпускать .NET Core 3 в течение года!»

Одна из действительно интересных вещей в .NET Core – это то, что он поддерживает полностью автономные приложения. То есть он не имеет внешних зависимостей. Вам не нужно ничего устанавливать, даже сам .NET Core. Вы можете скопировать вывод публикации проекта и передать его кому-нибудь для запуска. Это открывает огромные возможности, так как Вы, как разработчик, можете использовать нужные Вам фреймворки и рабочие версии, не беспокоясь о том, что помешаете другим приложениям, запущенным на компьютере, даже если рабочий вариант уже существует в box.

С полностью автономным приложением Вы сможете использовать Desktop Bridge для упаковки Вашей программы, чтобы пользователи легко могли её установить. На сегодняшний день шаблоны не поддерживают этот нестандартный сценарий, но, настроив должным образом, его можно запустить.

Вначале

Вам понадобится Visual Studio 2017 15.9 или, еще лучше, новый выпуск Visual Studio 2019 Preview. В настройках обязательно выберите рабочую нагрузку UWP для установки инструментов проекта упаковки. Загрузите .NET Core 3 Preview и создайте в нем первое WPF .NET Core приложение.

Подробно

В официальных документах описано, как добавлять проект упаковки в Ваше приложение. Microsoft советует начать с этого. В будущем, как только инструмент начнет работать, Вам будет достаточно этой информации. На данный момент, в качестве временного решения, в статье будут изложены основные принципы.

Здесь Вы можете ознакомиться с готовым продуктом. Различия, показывающие определенные изменения, здесь.

Цель состоит в том, чтобы проект упаковки сам выполнял публикацию в основном приложении, а затем использовал эти выходные данные в качестве входных данных для упаковки. Изменения необходимо внести в следующие файлы:

 

  1. Основной проект приложения, пример NetCoreDesktopBridgeApp.csproj.
  2. Проект упаковки, пример NetCoreDesktopBridgeApp.Package.wapproj.

 

Проект приложения

Начнем с основного проекта приложения, .csproj или .vbproj файла. Добавьте win-x86 к первой . Это гарантирует, что восстановление NuGet предоставит ресурсы, специфичные для среды выполнения, и поместит их в project.assets.json файл. Затем вставьте следующее:

 


  
    <_PublishItem Include="@(ResolvedFileToPublish->'%(FullPath)')" TargetPath="%(ResolvedFileToPublish.RelativePath)" OutputGroup="__GetPublishItems">
    <_PublishItem Include="$(ProjectDepsFilePath)" TargetPath="$(ProjectDepsFileName)">
    <_PublishItem Include="$(ProjectRuntimeConfigFilePath)" TargetPath="$(ProjectRuntimeConfigFileName)">
  

Полный файл проекта должен выглядеть следующим образом:

 

  


  
    WinExe
    netcoreapp3.0
    true

    
    win-x86
  

  
  
    
      <_PublishItem Include="@(ResolvedFileToPublish->'%(FullPath)')" TargetPath="%(ResolvedFileToPublish.RelativePath)" OutputGroup="__GetPublishItems">
    <_PublishItem Include="$(ProjectDepsFilePath)" TargetPath="$(ProjectDepsFileName)">
    <_PublishItem Include="$(ProjectRuntimeConfigFilePath)" TargetPath="$(ProjectRuntimeConfigFileName)">
    
  


Проект упаковки

Далее нужно добавить в (.wapproj) проект упаковки следующее, еще одно свойство:

 CoreClr

в , которая включает DefaultLanguage и EntryPointProjectUniqueName. Так Visual Studio говорит применять .NET Core отладчик. Примечание: чтобы использовать этот параметр, после установки Вам, возможно, нужно будет разгрузить / перезагрузить проект для VS. Если после изменения этого свойства система выдаст странную ошибку отладки, перезапустите VS, загрузите решение, и все должно заработать.

 

Затем найдите элемент. Если его нет, щелкните правой кнопкой мыши на Application node и добавьте ссылку на приложение в Ваш основной проект. Добавьте следующие атрибуты: SkipGetTargetFrameworkProperties = "true" Properties = "RuntimeIdentifier = win-x86; SelfContained = true". Полная ItemGroup должна выглядеть примерно так:

 


  
  

 

Наконец, когда проект почти закончен, добавьте следующий фрагмент после строки :

 



  @(PackageOutputGroups);__GetPublishItems

 

В этом фрагменте измените NetCoreDesktopBridgeApp\NetCoreDesktopBridgeApp.exe, чтобы он соответствовал имени и исполняемому файлу Вашего основного проекта.

Обходное решение VCRedist

В качестве контрольной точки Вам нужно указать зависимость пакета от VCRedist в Package.appxmanifest файле. Добавьте в элемент следующее:

. Когда пользователи установят Ваше приложение, Windows автоматически подтянет эту зависимость из хранилища.

 

Сборка и отладка

С указанными выше компонентами, Вы можете установить проект упаковки в качестве стартапа и выполнить отладку в обычном режиме. Он создаст программу и развернет его в локальном приложении. Выходные данные можно увидеть в bin\AnyCPU\\AppX каталоге Вашего проекта упаковки. Он должен содержать больше файлов, чем в вашем главном приложении, поскольку в нем будет автономная .NET Core среда выполнения.

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

Развертывание приложения

Существует два основных варианта развертывания пакета:

 

  1. Загрузка с помощью AppInstaller файла. Это замена ClickOnce.
  2. Microsoft Store. Пакет может быть отправлен в Store для распространения.

 

Двойная загрузка

Начиная с Windows 10 1803, загруженные приложения могут автоматически обновляться с помощью .appinstaller файла. AppInstaller является альтернативой ClickOnce для большинства сценариев. В документации описывается, как создать этот файл при публикации и поместить его в UNC-путь, общую папку или HTTPS-папку.

Если Вы загружаете контент, то нужно использовать сертификат подписи кода, которому доверяют Ваши пользователи. Для предприятия это может быть документ внутреннего центра сертификации, для общественности он должно быть получен в государственном органе. У DigiCert есть отличное предложение для сертификатов подписи кода, $ 74 / год для обычного и $ 104 / год для EV по специальной ссылке. После получения сертификата Вам необходимо обновить Package.appxmanifest, чтобы использовать его. В данной статье нет информации об автоматической подписи кода, но Вы можете ознакомиться с проектом службы подписи кода здесь.

Microsoft Store

Microsoft Store – отличный способ, чтобы Ваши пользователи узнали о приложении. Он обрабатывает подписывание кода, распространение и обновление. Более подробная информация о том, как подать приложение в Store, здесь и здесь.

 

Источник



Posted on 18. December 2018

XAML Behaviors для WPF теперь с открытым кодом

Microsoft рады сообщить, что XAML Behaviors для WPF теперь с открытым кодом.

Недавно, с большим успехом, был открыт исходный код XAML Behaviors для UWP. Behaviors NuGet пакет был загружен более 500 000 раз. XAML Behaviors для WPF теперь представлен в виде NuGet пакета – Microsoft.Xaml.Behaviors.Wpf. Это позволит быстрее добавлять новые функции и исправлять ошибки. Когда новый Behavior или функция добавляется в репозиторий, его можно будет использовать практически сразу. Возможность легко вносить изменения позволяет Behaviors платформе развиваться, устанавливать темп и направление. Однако Вы можете продолжать использовать Extension SDK, но в дальнейшем разработка будет осуществляться только на GitHub и будет публиковаться в NuGet пакете в новом  пространстве имен Microsoft.Xaml.Behaviors.

Начните работать с XAML Behaviors для WPF сейчас!

Вы можете установить последнюю версию WPF XAML Behaviors как в Visual Studio, так и в Blend с помощью NuGet диспетчера пакетов:

Из консоли диспетчера пакетов:

PM > Install-Package Microsoft.Xaml.Behaviors.Wpf

Из Blend Assets панели:

Как и в случае UWP, был обновлен Blend для Visual Studio 2019. Вместо представления предварительно заполненного Behaviors списка на Assets панели, Blend предлагает пользователю ссылку для установки NuGet пакета. Перейдя по ссылке, Вы сможете скачать последний NuGet пакет и заполнить список последними и лучшими Behaviors вариантами. Обратите внимание, что если это существующий проект, который ссылается на старый Behaviors SDK, список будет предварительно заполнен Behaviors из SDK. Ниже описаны шаги по переходу на NuGet пакет.

Перенос .NET Framework проектов из Extension SDK в NuGet

NuGet пакет обеспечивается с DLL библиотеками в Microsoft.Xaml.Behaviors пространстве имен. Поскольку API для WPF такие же, как и в оригинальном Extension SDK, переключение так же просто, как установка NuGet пакета и обновление и использование xmlns. Обратите внимание, что Behaviors поддерживается в .NET Core не полностью.

Последовательность переноса:
  1. Удалите ссылку на «Microsoft.Expression.Interactions» и «System.Windows.Interactivity».
  2. Установите NuGet «Microsoft.Xaml.Behaviors.Wpf» пакет.
  3. XAML файлы – замените xmlns пространства имен «http://schemas.microsoft.com/expression/2010/interactivity» и «http://schemas.microsoft.com/expression/2010/interactions» на «http://schemas.microsoft.com/xaml/behaviors».
  4. C# файлы – замените значения в c# файлах «Microsoft.Xaml.Interactivity» и «Microsoft.Xaml.Interactions» на «Microsoft.Xaml.Behaviors»

В заключение

Большое спасибо MVP руководителям за то, что они помогли в руководстве над этим проектом, так как теперь XAML Behaviors для WPF открыт для всех. 

Вклад в развитие новых и полезных Behaviors приветствуется и поощряется. Если у Вас есть отзывы, предложения или комментарии, пожалуйста, оставьте Ваш отзыв на странице GitHub или отправьте письмо.

Источник



Posted on 28. November 2018

Встраивание ввода данных в UWP приложения

Одной из наименее известных возможностей UWP приложений является встраивание ввода данных. Это будет особенно полезно, если Вы хотите предоставить пользователям ознакомительную инструкцию, мгновенную обратную связь с помощью дополнительных технологий или реализовать вкладку Help в приложении. Рассмотрим подробнее преимущества пространства имен Windows.UI.Input.Preview.Injection и его внедрение в приложения.

Поддерживаемые типы ввода

Windows 10 поддерживает несколько типов ввода. В настоящее время это:

  • Геймпад
  • Клавиатура
  • Мышка
  • Стилус
  • Сенсор

В этой статье будут приведены примеры ввода с помощью клавиатуры и мышки.

Возможность внедрения ввода

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

Добавление этой возможности простое и понятное. Откройте Package.appxmanifest как XML-файл и добавьте следующее описание пространства имен в Package элемент:

 


 

 

Пространство имен rescap - это хранилище для ограниченных возможностей. Теперь Вы можете добавить функцию inputInjectionBrokered в разделе Capabilities:


  
       
       


Основы

Основным классом в Windows.UI.Input.Preview.Injection является InputInjector. Вы можете создать его образец, вызвав статический TryCreate метод. После чего Вы можете вызвать соответствующие методы для каждого типа ввода:

 

var inputInfo = new InjectedInputMouseInfo();
...
InputInjector inputInjector = InputInjector.TryCreate();
inputInjector.InjectMouseInput(new[] { inputInfo });

 

 

Методы принимают список данных ввода, поэтому Вы можете последовательно выполнять несколько операций ввода.

Ввод с мышки

Вы можете подготовить информацию ввода с помощью мышки, используя InjectedInputMouseInfo класс. Чтобы двигать мышкой, используйте DeltaX и DeltaY свойства:

 

var info = new InjectedInputMouseInfo();
info.MouseOptions = InjectedInputMouseOptions.Move;
info.DeltaY = 100; //move down 100 points

 

Свойство MouseOptions позволяет указывать места, которые влияют на выполнение действий. Среди них LeftDown и LeftUp, которые можно использовать для имитации простого щелчка мышки:

 

var down = new InjectedInputMouseInfo();
down.MouseOptions = InjectedInputMouseOptions.LeftDown;

var up = new InjectedInputMouseInfo();
up.MouseOptions = InjectedInputMouseOptions.LeftUp;

InputInjector inputInjector = InputInjector.TryCreate();
inputInjector.InjectMouseInput(new[] { down, up });

 

Вы также можете имитировать как вертикальный, так и горизонтальный скрол мышки, используя Wheel и HWheel. Вы можете указывать расстояние прокрутки, используя свойство MouseData:

 

var info = new InjectedInputMouseInfo();
info.MouseOptions = InjectedInputMouseOptions.Wheel;
info.MouseData = 500; //scroll up

InputInjector inputInjector = InputInjector.TryCreate();
inputInjector.InjectMouseInput(new[] { info });

 

Прокрутка - это легко. Но как насчет прокрутки вниз?

 

info.MouseData = -500; //compile time error!

 

Обратите внимание, что свойство MouseData - это uint единица, которой нельзя присвоить отрицательные значения.

 

unchecked
{
    info.MouseData = (uint)-500; //scroll down
}

 

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

Ввод с мышкой также содержит свойство TimeOffsetInMilliseconds, которое можно установить для задержки отдельных действий. Это свойство рекомендуется для правильной имитации операций, таких как двойной щелчок.

Ввод с клавиатуры

Класс InjectedInputKeyboardInfo является базой для внедрения ввода с клавиатуры. Наиболее важное свойство - VirtualKey, которое указывает, к какому ключу относится ввод. Используя KeyOptions, Вы можете указывать дополнительные опции, такие как симуляция key up события.

Следующий образец показывает строку «привет» в активном поле ввода:

 

InputInjector inputInjector = InputInjector.TryCreate();
foreach (var letter in "hello")
{
    var info = new InjectedInputKeyboardInfo();
    info.VirtualKey = (ushort)((VirtualKey)Enum.Parse(typeof(VirtualKey),
                                 letter.ToString(), true));
    inputInjector.InjectKeyboardInput(new[] { info });
    await Task.Delay(100);
}

 

В конце foreach узла находится Task.Delay вызов. Это гарантирует, что повторные нажатия клавиш не регистрируются как одно нажатие.

Образец кода

Исходный образец кода доступен на GitHub.

Application Sample

В заключении

В этой статье мы подробно изучили пространство имен Windows.UI.Input.Preview.Injection и посмотрели, как его можно использовать для имитации ввода с разных типов устройств. Не смотря на то, что эта опция не так часто используется, она все же полезна в UWP API.

Дополнительная нформации



Posted on 26. November 2018

Начало работы с Windows Machine Learning

Благодаря обновлению Windows 10 в октябре 2018 года Windows Machine Learning стало частью AI набора инструментов. Windows ML механизм вывода локально оценивает предварительно обученные модели на Windows устройствах, устраняя проблемы с подключением, пропускной способностью и конфиденциальностью данных. Данные видеоролики помогут Вам понять, как начать работу с Windows ML, и познакомиться с новыми API через призму робота Руфуса.

Обзор Windows Machine Learning

Что такое Windows Machine Learning и чем он может быть полезен? Киллиан и Розан пройдутся по этим вопросам и объяснят определение и возможности этого мощного AI механизма вывода.


Windows Machine Learning: Hello World (Издание MNIST)

Давайте перейдем к коду. Киллиан и Розан работают над учебником по Windows ML MNIST и отвечают на вопросы, которые обычно задают разработчики.


Windows Machine Learning: модели и функции

Киллиан и Розан (с роботом Руфусом) обсуждают загрузку моделей и помогают определить ожидаемые входные и выходные характеристики данной модели.


Windows Machine Learning: выбор устройства

Киллиан и Пол (и робот Руфус) рассказывают, как выбрать устройство для оценки Windows ML модели, а также выясняют значение данной опции по умолчанию.


Windows Machine Learning: сессии и привязки

Киллиан и Пол (и робот Руфус) оценивают модель с Windows ML и рассказывают о важности сессий и привязок.


Предоставление обратной связи

Отправляйте Ваши отзывы о том, с какими темами касательно Windows ML Вы хотите ознакомиться в дальнейшем, написав @killianqueue в Твиттере!