Posted on 6. December 2017

Visual Studio Application Packaging Project

Visual Studio 2017 15.4 представил новый проект Windows Application Packaging, который поможет Вам модернизировать Ваше приложение с помощью нового стека развертывания Windows 10 приложений (Windows 10 App Deployment Stack).

Microsoft рассказывали об этом в предыдущей статье: Visual Studio 2017 Update 4 упрощает модернизацию Вашего приложения и делает его готовым к публикации, и сегодня Microsoft представит Вам новые возможности Visual Studio 2017 15.5, которые позволяют создавать новые сценарии для проекта упаковки Windows приложений с использованием всех преимуществ Windows 10 функций в Ваших приложениях.

В этой статье будут рассматриватся три примера, которые подчеркнут новые возможности, добавленные в проект упаковки, чтобы обеспечить упаковку не только для Win32 приложений, но и для приложений и UWP компонентов:

  1. Фоновое выполнение с использованием фоновых задач UWP.
  2. Интеграция Windows Shell с использованием соглашения о совместном использовании.
  3. Добавление инвестиций Win32 кода в пакеты UWP приложений.

Первые два примера это уже существующие WPF приложения, упакованные как APPX с расширенным функционалом, который реализован как UWP компоненты. Первое приложение добавляет фоновое исполнение на основе фоновых UWP задач, а второе приложение показывает, как активно внедрять приложение с Windows 10 оболочкой, используя функцию в виде соглашения о совместном использовании (Share contracts). В заключение, последнее приложение - это точка входа в UWP, вызывающая классический Win32 процесс, который взаимодействует с Excel.

Обратите внимание: Поскольку UWP компоненты необходимо скомпилировать для определенной платформы: x86 или x64, конфигурация любого конфигурационного решения для любого процессора не будет работать ни в одном из этих образцов.

Все образцы доступны в отчетах на GitHub, разделе Windows-Packaging-Samples. Для этих образцов требуется Visual Studio 2017 15.5 Preview 4 или выше, доступный для загрузки с https://www.visualstudio.com/downloads.

  1. WPF с Фоновыми Задачами

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

Чтобы показать, как использовать эту функцию в Ваших Win32 приложениях, Microsoft собирается реализовать небольшую утилиту, которая сделает HTTP-запрос к URL-адресу, настроенному пользователем, и покажет прошедшие миллисекунды в всплывающих уведомлениях (Toast Notification).

Microsoft создадаст WPF приложение, чтобы пользователь мог указывать URL-адрес для проверки и включения / выключения фоновых задач. Фоновая задача будет реализована как Windows Runtime Component (WINMD). Чтобы включить этот компонент в пакет, нужно создать UWP приложение, которое использует этот компонент, и, наконец, добавить WPF и UWP проекты в качестве ссылок на проект упаковки. Ниже приведен список необходимых шагов.

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

  1. Упакуйте Ваше настольное приложение, используя проект упаковки
  2. Добавьте Runtime Windows компонент для выполнения фоновой задачи
  3. Добавьте UWP приложение, которое ссылается на компонент времени выполнения
  4. Добавить ссылку на UWP приложение из проекта упаковки
  5. Настройте Фоновую задачу в манифесте
  6. Зарегистрируйте фоновую задачу из Настольного приложения

После завершения 1-4 шагов, у Вас должно быть решение для проектов, как показано на рисунке ниже:

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

Реализация Фоновых Задач

Фоновая задача - это класс C#, который реализует интерфейс IBackgroundTask. Этот интерфейс определяет Run метод, который будет вызываться, когда система запустит задачу.

public sealed class SiteVerifier : IBackgroundTask
{
    public async void Run(IBackgroundTaskInstance taskInstance)
    {
 
        taskInstance.Canceled += TaskInstance_Canceled;
        BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
        var msg = await MeasureRequestTime();
        ShowToast(msg);
        deferral.Complete();
    }
 
    private async Task MeasureRequestTime()
    {
        string msg;
        try
        {
            var url = ApplicationData.Current.LocalSettings.Values["UrlToVerify"] as string;
            var http = new HttpClient();
            Stopwatch clock = Stopwatch.StartNew();
            var response = await http.GetAsync(new Uri(url));
            response.EnsureSuccessStatusCode();
            var elapsed = clock.ElapsedMilliseconds;
            clock.Stop();
            msg = $"{url} took {elapsed.ToString()} ms";
        }
        catch (Exception ex)
        {
            msg = ex.Message;
        }
        return msg;
}

 

Обратите внимание, как используется LocalSettings в ApplicationData для обмена информацией между WPF приложением и фоновой UWP задачей.

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

Для регистрации фоновой задачи в системе, Вам нужно вызвать Windows 10 API из WPF приложения. Этот API доступен в Windows 10 SDK, и для его использования с .NET необходимо добавить ссылки, объясненные здесь. После того, как Вы получили доступ к Windows 10 API, Вы можете использовать класс BackgroundTaskRegistration для настройки фоновой задачи, как показано в приведенном ниже коде:

 

public void RegisterBackgroundTask(String triggerName)
{
    var current = BackgroundTaskRegistration.AllTasks
        .Where(b => b.Value.Name == triggerName).FirstOrDefault().Value;
 
    if (current is null)
    {
        BackgroundTaskBuilder builder = new BackgroundTaskBuilder();
        builder.Name = triggerName;
        builder.SetTrigger(new MaintenanceTrigger(15, false));
        builder.TaskEntryPoint = "HttpPing.SiteVerifier";
        builder.Register();
        System.Diagnostics.Debug.WriteLine("BGTask registered:" + triggerName);
    }
    else
    {
        System.Diagnostics.Debug.WriteLine("Task already:" + triggerName);
    }
}

 

Для регистрирации фоновой задачи, убедитесь, что задача не была зарегистрирована ранее, а затем используйте BackgroundTaskBuilder для настройки имени и Триггера, в этом случае используется MainteinanceTrigger.

2. Зарегистрируйте Ваше приложение в качестве Share Target

Совместные контракты - это Windows 10 функция, которая позволяет осуществлять обмен информацией между двумя приложениями, отправителем и получателем. Благодаря Desktop Bridge, Вы можете зарегистрировать UWP приложение в качестве общего получателя, а затем интегрировать с Win32 приложением. После регистрации приложения, оно будет отображаться каждый раз, когда пользователь вызывает функцию совместного использования, как показано ниже:

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

Пакет должен обозначить цель о совместном использовании (Share Target), включая имя UWP приложения:

При активации, приложение получает информацию о целевом ресурсе из параметра ShareOperation. Ниже приведен пример фрагмента кода:

protected async override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    operation = (ShareOperation)e.Parameter;
    if (operation.Data.Contains(StandardDataFormats.StorageItems))
    {
        var items = await operation.Data.GetStorageItemsAsync();
        file = items[0] as StorageFile;
        IRandomAccessStreamWithContentType stream = await file.OpenReadAsync();
 
        await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
        {
            BitmapImage image = new BitmapImage();
            this.img.Source = image;
            await image.SetSourceAsync(stream);
        });
    }
}

 

Теперь каждый раз, когда пользователь делится изображением и выбирает данное приложение, запускается Share UI приложение и затем отображается UWP-интерфейс.

После нажатия кнопки «Поделиться в WPF приложение», UWP вызывает обработчик событий и копирует изображение в папку ApplicationData, и затем запускает Win32 приложение с помощью FullTrustProcessLauncher.

private async void ShareBtn_Click(object sender, RoutedEventArgs e)
{
    await file.CopyAsync(ApplicationData.Current.LocalFolder);
    operation.ReportCompleted();
    await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
}

Для использования FullTrustProcessLauncher, применяется Desktop расширение для UWP, это расширение доступно в виде SDK ссылки, которая доступна в диалоговом окне UWP приложения «Add References»:

И, наконец, зарегистрируйте настольное расширение и целевой выполняемый файл в манифесте:

 

<... >

 

3. Добавьте Office взаимодействие из UWP приложения

Одной из ключевых особенностей Desktop Bridge является возможность добавлять исполняемые Win32 файлы в Ваш пакет приложений и запускать их как цельный процесс из UWP приложения. Теперь, с проектом Windows Application Packaging, Вы можете создавать пакеты, содержащие двоичные UWP, так и Win32 файлы.

Дополнительно к диспетчеру процессов, есть расширение App Service, которое поможет Вам установить канал связи между Вашим UWP приложением и Win32 процессом.

В этом примере показан способ добавления Win32 процесса (приложение командной строки) для управления Excel листом с использованием офисного взаимодействия.

Microsoft начинает с UWP приложения, которое использует сетку данных Telerik для отображения некоторых табличных данных, также будет добавлена  кнопка для экспорта одних и тех же данных в Excel, как показано ниже:

Исследователь решений этого примера очень похож на предыдущий пример с тремя проектами в решении: UWP приложение, командная Win32 строка и проект упаковки со ссылкой на оба проекта. Тем не менее, обратите внимание, что в этом случае точкой входа приложения (выделенной жирным шрифтом) является UWP проект:

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

Для открытия канала связи в Win32 процессе, добавьте ссылку на Windows API, как описано здесь:

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

 

Connection = new AppServiceConnection();
connection.AppServiceName = "ExcelInteropService";
connection.PackageFamilyName = Windows.ApplicationModel.Package.Current.Id.FamilyName;
connection.RequestReceived += Connection_RequestReceived;
connection.ServiceClosed += Connection_ServiceClosed;

 

Заключая данную статью

Новые функции, добавленные в проект упаковки в Visual Studio 2017, помогут Вам модернизировать существующие настольные приложения для получения максимального результата от UWP и Win32 в одном пакете. Этот новый проект поможет Вам настроить Ваш пакет с помощью конструктора манифеста, отладить Ваше приложение в контексте Desktop Bridge и, наконец, поможет подготовить пакеты для отправки в Microsoft Store или на другие ресурсы. Для получения дополнительной информации изучите:

 



Exception: Collection was modified after the enumerator was instantiated.
Posted on 23. October 2017

Visual Studio 2017 Update 4

Visual Studio 2017 Update 4 упрощает модернизацию Ваших приложений

В прошлом году обновление Windows 10 Anniversary Update добавило поддержку Desktop Bridge для модернизации приложений с помощью универсальной платформы Windows и их распространения в Windows Store и Microsoft Store for Business на всех Windows 10 ПК, включая устройства, которые работают под управлением Windows 10 S.
В то время, первым инструментом разработчика был Desktop App Converter, который преобразовывает Ваш текущий установщик приложений в пакет Windows приложений (файл .appx), который может быть отправлен в Windows Store или развернут по Вашему выбору. С четвертым обновлением для Visual Studio 2017 добавлена отличная поддержка для работы непосредственно в Visual Studio для Ваших настольных Windows приложений (WPF, Winforms, Win32 и другие). С помощью новых инструментов Вы можете создавать, настраивать, развертывать, тестировать и отлаживать Ваши Desktop Bridge приложения во время разработки в VS, просто нажимая F5!
Сегодня мы покажем Вам пошаговый пример работы с новым обновлением. Начнем с Winforms приложения, которое демонстрирует различные элементы управления диаграммой. Приложение было создано несколько лет назад в старой VS версии с .NET 4. Теперь Microsoft хочет выпустить и постепенно модернизировать его в Windows Store.  В этом блог посте мы покажем Вам, как это легко с Update 4 для Visual Studio 2017.

Шаг 1 - Добавьте к решению проект Windows App Packaging 

Прежде чем начать, убедитесь, что Ваш проект настольных приложений загружен в Visual Studio 2017 и создается без ошибок. Затем, на следующем этапе, необходимо упаковать приложение в виде пакета Windows приложений (файл .appx), чтобы Winforms приложение могло использовать все те же функции развертывания Windows 10 приложений, которые доступны для UWP приложений: чистая установка и удаление, безперебойные обновления, распространение в Store и многое другое. Для этого Вам нужно воспользоваться новыми возможностями инструментов в четвертом обновлении Visual Studio 2017. Microsoft добавляет новый проект к решению «Windows Application Packaging Project»:

Теперь нужно указать Ваши минимальные / целевые версии ...

... укажите в проекте упаковки, какой проект должен быть включен в пакет. Для этого щелкните правой кнопкой мыши на узле «Applications» и установите ссылку на Winforms проект.

Важно! Выберите проект «DistributionPackage» в качестве запуска Вашего проекта. Затем, нажмите F5 и посмотрите, как Ваше приложение будет упаковано, развернуто и запущено в качестве Desktop Bridge приложения. Вы можете начать тестирование и отладку в новом контексте выполнения. Если Вы установите проект Winforms в качестве проекта запуска и нажмете F5, Вы все равно можете проверять и отлаживать неупакованную версию Вашего приложения.

Шаг 2 – Настройка приложения для публикации в Windows Store

Итак, Ваше приложение уже работает как Desktop Bridge приложение, и Вы успешно его протестировали и отладили в этой конфигурации. Затем Вам просто нужно приложить завершающие штрихи к пакету, чтобы он хорошо сочетался с Windows 10 Shell (тайлы, символы и другое) и убедиться, что пакет соответствует требованиям публикации Windows Store. Во-первых, нужно заменить визуальные активы по умолчанию, подвязанные к шаблону проекта, на действительные, специфичные для приложения активы. В Visual Studio 2017 это очень легко с помощью Visual Assets Manager в редакторе манифеста пакета:

Чтобы подготовиться к публикации в Windows Store, необходимо создать приложение в Windows Dev Center и зарезервировать имя Вашего приложения, загрузить скриншоты, установить цену, возрастные категории и другое. Если Вы не планируете распространять приложение в Windows Store, Вы можете пропустить этот шаг.

Последнее, что нужно сделать перед публикацией Вашего приложения, - это создать пакеты, которые готовы к развертыванию и совместимы с требованиями Windows Store. Этот пакет может содержать двоичные файлы для разных архитектур, ресурсы для разных локалей, а также символы для двоичных файлов, чтобы в дальнейшем Вы могли проанализировать любые отчеты о сбоях в Dev Center или Mobile Center. Это можно сделать для Desktop Bridge приложений, как и для любого UWP приложения, непосредственно из Visual Studio:

В рамках создания пакетов, также проводятся сертификационные тесты, после которых пакеты отправляются на сертификацию и публикацию в Dev Center. Теперь Вы можете оценить результат Вашей публикации и установить пример приложения на Ваш компьютер из Windows Store, здесь доступен исходный код приложения.

Какие дополнительные преимущества открываются разработчикам?

Помимо распространения и монетизации через Windows Store, Ваше приложение обладает современными возможностями развертывания, встроенными в Windows 10. Вам больше не нужно создавать установщик, обновления являются автоматическими и дифференциальными. Удаление приложения гарантированно будет правильным. Кроме того, так как Ваше приложение теперь находится в Windows 10 App Model, у Вас есть доступ к API и UWP функциям, таким как живые плитки, интеграция Cortana, фоновые задачи и другие. Еще одним важным преимуществом специально для Windows Forms приложений является новая качественная DPI поддержка в .NET 4.7, которая включена в Windows Creators Update (1703). В данном примере, приложение использует эту новую поддержку, следуя шагам, описанным в этой статье.

Более того

Говоря об установщиках, знаете ли Вы, что пакет Вашего приложения также является Вашим установщиком в Windows 10? Пользователи могут просто щелкнуть, чтобы установить его, если он подписан с сертификатом, который доступен для целевого устройства. Это позволяет распространять Ваше модернизированное настольное приложение таким образом, чтобы это соответствовало Вашему сценарию, без необходимости публикации в Windows Store - например, для LOB приложений на предприятии. Здесь Вы можете узнать больше о данной возможности.

Вывод

Получение готового проекта разработки настольных приложений для публикации в Windows Store стало намного легче с четвертым обновлением Visual Studio 2017. После преобразования Вашего Windows приложения в Windows App Package, оно может пользоваться всеми преимуществами Windows 10 и начать использовать новые API и функции Windows 10. Здесь Вы найдете ресурсы для получения дополнительной информации:

Оригинал анонса



Exception: Collection was modified after the enumerator was instantiated.
Posted on 4. September 2017

Лучшие рекомендации по использованию видеорекламы в Windows приложениях

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

Вот некоторые советы и рекомендации по использованию межстраничных видеороликов в приложении для максимальной доходности:

Рекомендуется:

  1. В Вашем приложении или игре должен быть определенный пользовательский интерфейс, где будут отображаться видеоролики. Поскольку видеореклама полностью накладывается на экран приложения, она должна использоваться с осторожностью и не должна прерывать пользователя во время игры или использования приложения. Типичные примеры использования межстраничных объявлений находятся между уровнями игры или при переходе на новую вкладку в приложении.
  2. Установите «Автоматическую» конфигурацию рекламного блока. Это позволит Microsoft определять лучшую последовательность рекламных блоков для каждого входящего запроса объявлений, предоставляя разработчикам максимальный потенциал дохода от приложений.
  3. Поддерживайте эффективную видимость видеообъявлений. СМИ Рейтинги определяют эффективную рекламную видимость как: «Не менее 50% пикселей в рекламе находятся на вкладке браузера в фокусе видимого пространства страницы браузера; требование пикселя выполняется в течение как минимум двух или более непрерывных секунд в любой точке рекламы». Для лучшей доходности и предотвращения мошенничества многие рекламодатели платят только тогда, когда впечатление от просмотра действительно эффективное. Убедитесь, что, когда Вы показываете видеоорекламу в Вашем приложении, она воспроизводится полностью и не заслоняется другим экраном в приложении.

 

Не рекомендуется:
  1. Предварительное кэширование на длительный период. Объявление от того же рекламного провайдера, доступное в данный момент, может быть недоступно уже через несколько секунд. Учитывая это, разработчики приложений должны свести к минимуму предварительную выборку объявлений до менее чем 8 секунд, прежде чем они будут готовы к добавлению рекламы в приложение.
  2. Повторять несколько одинаковых запросов. В случае отсутствия ответа на объявление, разработчик не должен постоянно добавлять по несколько рекламных запросов. При запуске нескольких запросов и отсутствии показа рекламы, рекламный блок становится все более низкого качества, что еще больше снижает вероятность получения рекламы в будущем. Сделайте следующий запрос только в том случае, если он будет на ровне с пользовательским потоком в приложении или игре, и Вы будете снова готовы показать объявление.
Microsoft тесно сотрудничает с многими рекламными сетями, чтобы предоставить лучший спрос на Windows приложения и повысить уровень рейтингов и монетизацию для разработчиков. Чтобы узнать больше о добавлении видеообъявлений в Ваши приложения, прочитайте эту статью. Спасибо, что Вы с нами!



Exception: Collection was modified after the enumerator was instantiated.
Posted on 2. September 2017

Cognitive Toolkit Model Evaluation для UWP

Microsoft Cognitive Toolkit (CNTK) 2.1 добавила поддержку оценки образцов для UWP приложений. Это означает, что Вы можете оценивать продуктивность Ваших Windows приложений, опубликованных в Windows Store! В этом блоге Вы узнаете, как можно внедрить AI продуктивность в Ваши приложения.

Цикл целенаправленного интеллекта

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

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

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

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

Пример классификации изображений

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

Код для всей системы доступен в CNTK Github реестре.

В настоящее время поддерживаются только C++ CNTK UWP. Однако образец демонстрирует, как решение UWP на основе C# может выполнять оценку модели, ссылаясь на WinRT библиотеку, которая обертывает UWP-совместимые CNTK компоненты, доступные на NuGet.

packages.config определяет NuGet пакеты, используемые библиотекой, и указывает на UWP-совместимый пакет:

 



  

 

Этот NuGet пакет предоставляет UWP-совместимые CNTK компоненты, включая математическую библиотеку OpenBLAS, для оценки модели на основе ЦП. ImageRecognizerLib предоставляет методы Create и RecognizeObjectAsync, используемые для загрузки предварительно обученной модели CNTK и классифицирует указанный вход изображения как множество байтов.

Остальная часть решения представляет собой несколько простых элементов XAML интерфейса для принятия ввода от пользователя. Вот краткое изображение приложения в действии:


Теперь Вы знаете, как использовать недавно добавленную поддержку UWP в CNTK для обеспечения следующего уровня "интеллекта" для Windows приложений. Команда Microsoft ждет новых результатов и потрясающих приложений, разработанных с помощью этой технологии!



Exception: Collection was modified after the enumerator was instantiated.
Posted on 16. August 2017

Новые инструменты в Windows Device Portal для Windows 10 Fall Creators Update

Device Portal в Windows 10 Fall Creators Update теперь предлагает несколько новых инструментов для Windows платформы, чтобы помочь Вам провести локальную проверку Вашего UWP, изучить возможности Mixed Reality, создать новое аппаратно-программное оборудование и протестировать новую систему для установки Вашего приложения. В этой статье мы расскажем Вам больше об этих возможностях!

Если Вы не знакомы с Device Portal, Вы можете ознакомиться с его особенностями на Device Portal, или просмотреть новый docs.microsoft.com, чтобы узнать, как его настроить.

Все эти инструменты поддерживаются REST API, поэтому Вы можете использовать его из сценариев или клиентских приложений с помощью Device Portal Wrapper.

Тестирование на основе местоположения

У большинства из нас нет возможности для тестирования приложений по всему миру, но теперь этому есть решение! Инструмент «Местоположения» в Device Portal позволяет легко изменять местоположение, которое Windows привязывает к приложениям. Выбрав «Переопределить», Вы можете изменить местоположение устройства на все, что Вы установили, используя текстовые поля или карты. Обязательно уберите галочку, когда закончите, чтобы Ваше местоположение (и часовой пояс) вернулись в реальную геолокацию...

Рисунок 1: Приложение News актуально и соответсвует местным заголовкам!

Это также работает для веб-страниц в Microsoft Edge, позволяя Вам проверять Ваши сайты в разных уголках мира.

Примечания о том, что этот инструмент может и не может сделать:
  • Он не именяет локацию вашего ПК! Таким образом, приложение News все еще видит местоположение пользователя EN-US в середине Италии. 
  • Вы можете не видеть все приложения, использующие это местоположение. Некоторые программы не используют Windows API для определения местоположения или имеют специальную логику (например, используя Ваш IP-адрес) для определения Вашего местоположения.
  • Этот инструмент отмечает PositionSource для местоположения данных как «Default». Некоторые приложения могут проверять источник и изменять их поведение на его основе.
USB диагностика

USB диагностика распространяется на всех пользователей аппаратного обеспечения - если Вы уже знакомы с «HLK» или «WDK», это будет очень удобно. USB команда обновила инструмент USBView для работы внутри Device Portal, поэтому разработчики, работающие на новом оборудовании, будут иметь больше возможностей.

Инструмент USB Devices может оказаться немного сложным - для начала, откройте меню в правом верхнем углу и перейдите к разделу «Добавить инструменты в рабочую область». Прокрутите страницу вниз и проверьте раздел «USB-устройства», а затем нажмите «Добавить». В результате, Вы получите полный обзор Ваших USB-узлов, контроллеров и периферийных устройств. Узлы и контроллеры расширяются, чтобы показать отдельные устройства, используя значок + (плюс), и при нажатии на механизм, он будет расширяться, чтобы показать свойства всех элементов.

Инструмент Streaming Install Debugger

Windows 10 Creators Update добавил «потоковую установку» для UWP, которая позволяет пользователю запускать приложение перед его окончательной загрузкой. Для легкой проверки данной функции, команда App Model добавила инструмент Streaming Install Debugger в Device Portal. Чтобы использовать его, разверните приложение с группами контента на Вашем устройстве, а затем откройте Streaming Install Debugger. В нем Вы сможете редактировать состояния групп контента. Для того, чтобы Вы могли протестировать работу Ваших приложений, происходит имитация потоковой установки, и Вы можете удостовериться, что все действия правильно выполняются при отсутствии групп контента.


Для получения дополнительной информации ознакомьтесь с блогом Andy Liu, где рассказывается о новых инструментах App Installer и Streaming Install Debugger.

Mixed Reality (Смешанная реальность)

Одним из прорывов в обновлении Fall Creators Update является добавление поддержки Mixed Reality на Windows Desktop. В рамках этой версии Microsoft включает набор инструментов, помогающих разработчикам создавать потрясающие приложения для Mixed Reality. Два из этих инструментов - 3D View и Framerate counter - уже могут быть знакомы для HoloLens разработчиков. Также добавлен новый вариант запуска приложения, который появляется, когда у Вас установлена необходимая гарнитура для запуска Вашего приложения в Mixed Reality.

Частота смены кадров - важный фактор при создании удобных приложений для смешанной реальности, и разработчикам необходимо оптимизировать производительность, чтобы достичь абсолютной частоты смены кадров в системах, которые они поддерживают. Инструмент Frame Rate в Device Portal помогает, показывая разработчикам как частоту смены кадров их приложения, так и компоновщика системы.

 

3D View помогает при тестировании гарнитуры с эффектом погружения в среду и с реальным миром, отображая его положение, когда оно перемещается по пространству.

 

Что же хорошего в том, если Вы не можете запустить Ваше приложение, подключая гарнитуру с эффектом погружения в иную среду? Теперь, когда у Вас установлена встроенная гарнитура, инструмент «Installed Apps» добавит кнопку, позволяющую запустить приложение в HMD. Не смотря на то, что приложения с эффектом другой реальности всегда будут работать в Mixed Reality, эта новая кнопка также особенно полезна для 2D UWP приложений (или приложений, которые переключаются между 2D и иной реальностью), когда Вы хотите протестировать их в Mixed Reality. 

 

В завершение нашего поста, мы сообщаем, что команда Microsoft будет рады получить Ваши идеи по улучшению Device Portal, которые помогут разрабатывать или отлаживать приложения. Оставьте Ваш комментарий на UserVoice. Если Вы столкнулись со сбоями во время отправки Вашего отзыва, отправьте его через центр обратной связи "Feedback Hub".

Похожие посты:

Использование Device Portal для просмотра журналов отладки для UWP

Использование App File Explorer для просмотра данных Вашего приложения



Exception: Collection was modified after the enumerator was instantiated.
Posted on 11. August 2017

Xbox Live Creators Program

https://blogs.windows.com/buildingapps/2017/08/10/xbox-live-creators-program-now-live/#8IBMelrVTScVKZzG.97 

В марте Microsoft выпустили Xbox Live Creators Program. Уже сегодня рад сообщить, что любой разработчик может публиковать свои игры на Xbox One и Windows 10. У Microsoft уже были отличные игры, опубликованные во время предварительного просмотра программы (смотрите список ниже!), Но пришло время опубликовать и Вашу игру. Microsoft стремится обеспечить каждому разработчику, который хочет опубликовать свою игру на ПК под управлением Windows 10 и на Xbox One console family и Creators Program позволяет публиковать такие приложения.

Что же такое Creators Program? Xbox Live Creators Program позволяет любому разработчику напрямую публиковать свои игры - любую из своих игр - на Xbox One consoles и ПК под управлением Windows 10 со стандартным процессом сертификации, уже существующим для любого другого приложения или игры на Universal Windows Platform. Другими словами, если у Вас есть Dev Center аккаунт, Вы сможете опубликовать Вашу игру на Xbox One и ПК под управлением Windows 10.

Всё становится еще лучше! Используя Creators Program Вы также сможете реализовать ряд сервисов Xbox Live непосредственно в Вашей игре. Такие вещи, как Gamertag Presence, Xbox Live leaderboards и Connected Storage. Данные возможности облегчат Ваши задачи по разработке игр, а также улучшат опыт Ваших пользователей. Вы также можете использовать функции "убийц", такие как Game Hubs и Clubs, Mixer streaming (и интеграцию для более интерактивного взаимодействия) и некоторые действительно превосходные возможности доступа, которые сделают Вашу игру доступной для еще более широкой аудитории.

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

Любая Creators Program игра, опубликованная в Windows 10 Store будет указана в категории «Игры». На Xbox One console создан специальный Store раздел под названием Creators Collection, так что Ваша игра будет доступна пользователям, которые ищут что-то новое. Microsoft также сделали это по желанию и отзывам геймеров, родителей и разработчиков, которые так любят Xbox One Store. Итак, наличие Creators Collection предоставляет самые лучшие возможности в Store и доступ абсолютно всем пользователям.

Нравится ли Вам новая Creators Program? Теперь всё намного легче! Первый шаг - создать игру, используя инструменты UWP и Xbox Live SDK, которые Вы уже, вероятно, использовали: Visual Studio, игровые движки, такие как Unity, Construct 2, MonoGame и Xenko, объединяя их с распространенным Xbox One console и Вашим Dev Center аккаунтом. Вам нужно установить бесплатное приложение Dev Mode Activation с Xbox Store, и тогда Вам будет достпуно конвертирование этой распространенной программы с помощью пару кликов.

Аккаунт Dev Center - стандартный для тех, кто разрабатывает приложения или игры для Microsoft. Если у Вас еще нету аккаунта, он будет стоить всего 20 долларов в качестве разовой платы. Затем, приступите к Вашей Xbox Live интеграции, выполнив пошаговое руководство для использования Creators Program, и также Xbox Live Creators Program.

Игры Creators Program имеют доступ к большому набору Xbox Live сервисов, но не ко всем из них. Вы сможете реализовать такие функции, как вход и присутствие, использование Вашего Gamertag, leaderboards, доступ к Вашему Activity Feed, Game Hubs, Clubs, Party Chat, Game DVR и Mixer трансляции.

Однако, поскольку Creators Program - открытая, а не управляемая программа, некоторые сервисы Вам недоступны: Achievements, Gamerscore или сетевой мультиплеер. Хорошая новость заключается в том, что если Вы хотите получить доступ к этим функциям, Microsoft рекомендует обратиться к ID@Xbox программе, где все сервисы будут доступны. И, конечно, есть путь для перехода игр от Creators Program к ID@Xbox в течении разработки (и даже после того, как Ваша игра была опубликованна в Store), если затем Вы решите добавить Gamerscore, Achievements или интернет-мультиплеер.

Не смотря на то, что ID@Xbox была создана для профессиональных разработчиков игр, которые хотят использовать полный набор функций Xbox Live через весь процесс сертификации, Creators Program предоставляет абсолютно всем разработчикам «нужный» набор Xbox Live услуг. Creators Program - это упрощенный способ создания и публикации игр в Xbox сообщество как для новичков в мире разработки, так и для настоящих профессионалов.

Microsoft предоставил несколько наглядных примеров. Более того, это самое начало! Microsoft собирается подчеркнуть все преимущества игр Creators Program, выпуская больше игр на Xbox Wire. Ваша игра тоже должна быть в этом списке.

Ниже предоставлены первые преимущества, доступные с помощью этой программой:

  • Animal Rivals, Blue Sunset Games: Animal Rivals - боевая игра для одного-четырех игроков. Погрузитесь в игровой мир и сражайтесь за трон Animalonia как один из соперников в разных мини-играх и местах. Сама игра представляет собой уникальный стиль, сочетающий мультяшный внешний вид и сатирический подход. (Xbox One, Windows 10)
  • Block Dropper, Tresiris Games: Block Dropper - это быстрый, аркадный стиль с 3D-платформером. Старайтесь не сдаваться, когда Вы направляете Вашего персонажа через сложный режим одиночного игрока или хватаете друга, чтобы сражаться в местной многопользовательской Block Battle Arena. Tresiris - небольшая игровая студия, базирующаяся в Олате, штат Канзас, которая создает веселые и простые игры в отличном качестве. (Xbox One, Windows 10)
  • Crystal Brawl, Studio Mercato: Gauntlet встречается с NBA Jam в Crystal Brawl, локальной многопользовательской игре с захватом 2v2, которая объединяет быстрые действия с помощью стратегии, подобной MOBA. Выберите из множества персонажей с различными способностями: каждый персонаж обладает уникальной способностью, которая изменяет местность. Экспериментируйте с различными комбинациями символов, чтобы обнаружить скрытые стратегии! Studio Mercato - игровая студия, которая находиться в Нью-Йорке. (Xbox One, Windows 10)
  • Derelict Fleet, Bionic Pony: Derelict Fleet - быстро развивающаяся космическая боевая игра. Вам поручено защищать флот беженцев, когда вы путешествуете по звездам, ища новую колонию, чтобы позвонить домой. Bionic Pony - небольшая инди-студия, базирующаяся в Тампе, штат Флорида, которая начала создавать Xbox Live инди-игры в 2010 году. (Xbox One)
  • ERMO, Nonostante: ERMO - это расслабляющая игра-головоломка с умиротворяющей и мирной графикой. Увлекитесь ландшафтами и цветами в ERMO. Вы узнаете правила игры за несколько секунд, и ERMO захватит Вас в удивительный игровой мир. (Xbox One)
  • GalactiMAX!, ONLYUSEmeFEET: В темноте пространства GalactiMAX есть игрок, снимающий инопланетян для очков, чтобы пронзить небеса в классическом аркадном шутере! По мере того, как больше инопланетян будут побеждены, корабль игрока будет увеличиваться по размеру и мощности. Как можно заполучить этот корабль?! (Xbox One, Windows 10)
  • kubic, Pixel Envision Ltd: kubic - это расслабляющая игра-головоломка с оптической иллюзией, основанная на M.C. Искусство Эшера, невозможные объекты и другие геометрические конструкции. Смысл заклчается в том, чтобы сконструировать конфигурацию цели из нескольких частей. (Xbox One, Windows 10)
  • Space Cat!, GershGamesLLC: Простреливайте Ваш путь мимо натиска врагов и боссов. Собирайте оружие, ракеты, бомбы, лазерные лучи и многое другое. GershGamesLLC - группа молодых любителей, которые веселятся в выходные. (Xbox One, Windows 10)
  • Stereo Aereo, The Stonebot Studio: Stereo Aereo - это ритм-игра, вдохновленная влиянием поп-культуры 80-х годов. Вы, как игрок, должны убедиться, что посредственная космическая рок-группа Stereo Aereo добирается до своей жизни, меняя концерт вовремя, в этой комической научной фантастике. (Xbox One, Windows 10)

В завершение поста, хочу отметить, что Creators Program стала открытой для любого разработчика, команда Microsoft также объявила конкурс Dream.Build.Play, который включает категорию Xbox One для любого разработчика игр, который использует функции Creators Program в своей игре. Таким образом, Вы можете не только получить Вашу игру на Xbox One console первым, у Вас есть шанс выиграть за это деньги. 
Желаю удачи!



Exception: Collection was modified after the enumerator was instantiated.
Posted on 3. August 2017

Настройка Вашего приложения для входа в систему

В течение долгого времени пользователи ПК могли настроить приложения Win32 для запуска или входа в систему. Это также было возможно для приложений Desktop Bridge с момента обновления Windows 10 (v10.0.14393.0). Теперь Microsoft расширили эту функцию, чтобы в нее также вошли стандартные UWP приложения. Это доступно в сборках Insider Build 16226 и вместе с соответствующим SDK. В этом посте мы рассмотрим изменения кода, которые необходимо внести в манифест и в класс приложения для обработки сценария запуска, и то, как Ваше приложение может удовлетворять требования пользователей. 

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

 

Прежде всего следует отметить, что Вы должны использовать расширение windows.startupTask Extension в манифесте приложения в узле «Extensions», который является сгенерированным узлом приложения. Ознакомьтесь с подробной информацией здесь. Такая же декларация расширения используется как для Desktop Bridge, так и для стандартных UWP приложений, но есть некоторые отличия.

 

  • Desktop Bridge доступен только на десктопе, поэтому он использует пространство имен XML для конкретного рабочего стола. Новая реализация UWP предназначена для использования, как правило, в UWP, поэтому использует общее пространство имен UAP (контрактная версия 5) - хотя в настоящее время он по-прежнему доступен только на рабочем столе.
  • Desktop Bridge EntryPoint должен быть «Windows.FullTrustApplication», тогда как для стандартного UWP это полное имя пространства имен Вашего класса приложения.
  • Приложения Desktop Bridge могут установить атрибут значения Enabled, а это означает, что приложение запустится при запуске без необходимости ручного включения. И наоборот, для стандратных UWP приложений этот атрибут игнорируется, а функция автоматически становится недоступной. Вместо этого пользователь должен сначала запустить приложение, и приложение должно запросить его включение для активации запуска.
  • Для приложений на Desktop Bridge разрешено несколько StartupTask расширений, каждый из которых может использовать другой исполняемый файл. И наоборот, для стандратных UWP приложений у Вас будет только одно исполняемое и одно StartupTask расширение.
Приложение Desktop Bridge 

xmlns:desktop="http://schemas.microsoft.com/
appx/manifest/desktop/windows10"
  
UWP приложение 

xmlns:uap5="http://schemas.microsoft.com/
appx/manifest/uap/windows10/5"
  

Для приложений Desktop Bridge и стандартных UWP приложений пользователь всегда находится под контролем и может в любой момент изменить Enabled состояние запуска Вашего приложения на вкладке «Startup» в Task Manager:

 

Также, для обоих типов приложений, приложение должно запускаться, по крайней мере, один раз, прежде чем пользователь сможет изменить состояния Disabled/Enabled. На самом деле это немного усложненно: если пользователь не запускает приложение, а затем пытается изменить состояние на «Enabled» в Task Manager, это скорее всего будет установлено. Однако, если Вы закроете Task Manager и снова откроете его, Вы будете видеть, что состояние по-прежнему отключено. Что же происходит? Task Manager сохраняет выбор пользователя в состоянии Enabled - но это фактически не позволяет приложению активироваться при запуске, если оно не будет запущено по крайней мере один раз - следовательно, это и есть причиной, по которой устанавливается состояние Disabled.

В Вашем UWP коде Вы можете установить запрос для включения при запуске. Для этого используйте метод StartupTask.GetAsync для инициализации объекта StartupTask (описанного здесь) - затем, перейдите в TaskId, указанного вами в манифесте, - и после этого, вызовите метод RequestEnableAsync. В тестовом приложении команда Microsoft делает это в обработчике Click. Возвращаемое значение запроса - это новый (возможно, неизменный) StartupTaskState

 

async private void requestButton_Click(object sender, RoutedEventArgs e)
{
    StartupTask startupTask = await StartupTask.GetAsync("MyStartupId");
    switch (startupTask.State)
    {
        case StartupTaskState.Disabled:
            // Task is disabled but can be enabled.
            StartupTaskState newState = await startupTask.RequestEnableAsync();
            Debug.WriteLine("Request to enable startup, result = {0}", newState);
            break;
        case StartupTaskState.DisabledByUser:
            // Task is disabled and user must enable it manually.
            MessageDialog dialog = new MessageDialog(
                "I know you don't want this app to run " +
                "as soon as you sign in, but if you change your mind, " +
                "you can enable this in the Startup tab in Task Manager.",
                "TestStartup");
            await dialog.ShowAsync();
            break;
        case StartupTaskState.DisabledByPolicy:
            Debug.WriteLine(
                "Startup disabled by group policy, or not supported on this device");
            break;
        case StartupTaskState.Enabled:
            Debug.WriteLine("Startup is enabled.");
            break;
    }
}

 

Поскольку приложения Desktop Bridge имеют компонент Win32, они работают с гораздо большей мощностью, чем стандартные UWP приложения. Они могут установить значение Enabled для StartupTask в манифесте и для этого не нужно вызывать API. Для стандатрных UWP приложений поведение более ограничено, в частности:

 

  • По умолчанию установлено значение «Disabled», поэтому в обычном случае пользователь должен запускать приложение хотя бы один раз - это дает приложению возможность запросить его включение.
  • Когда приложение вызывает RequestEnableAsync, в нем появится диалоговое окно «Пользовательское приглашение» для UWP приложений (или, если Вы вызываете его из компонента UWP в приложении на Desktop Bridge из Windows 10 Fall Creators Update). 
  • StartupTask включает метод Disable. Если состояние «Enabled», приложение может использовать API, чтобы поставить его на «Disabled». Если приложение затем снова запросит включение, это также вызовет приглашение пользователя.
  • Если пользователь отключает (либо через приглашение пользователя, либо через вкладку Startup в Task Manager), то приглашение снова не отображается, независимо от каких-либо запросов приложения. Конечно, приложение может разработать свои собственные пользовательские приглашения, попросив пользователя внести вручную изменения в Task Manager, но если пользователь точно отключил Ваш запуск, необходимо уважать его решение и убрать данные уведомления. В приведенном выше примере кода приложение реагирует на DisabledByUser, открывая свой собственный диалог сообщений - по желанию Вы можете это сделать, но следует подчеркнуть, что существует риск, что пользователю это не понравится.
  • Если функция отключена локальным администратором или политикой группы, то приглашение пользователя не отображается, а запуск не может быть активирован. Существующее перечисление StartupTaskState было расширено с новым значением DisabledByPolicy. Когда приложение увидит DisabledByPolicy, ему следует избегать повторного запроса, чтобы задача была включена, потому что запрос никогда не будет одобрен до тех пор, пока политика не изменится.
  • Платформы, отличные от Desktop, которые не поддерживают задачи запуска, также сообщают об отключенной функции.
Если запрос инициирует приглашение пользователя (только для UWP приложений), сообщение включает DisplayName, указанное в Вашем манифесте. Это приглашение не отображается, если при состояниях DisabledByUser или DisabledByPolicy.

Если Ваше приложение включено для активации при запуске, Вы должны обработать этот случай в Вашем классе приложения, переопределив метод OnActivated. Проверьте IActivatedEventArgs.Kind, чтобы узнать, является ли это ActivationKind.StartupTask, и если да, рассмотрите IActivatedEventArgs в StartupTaskActivatedEventArgs. Из этого, при необходимости, Вы можете получить TaskId. В данном тестовом приложении Microsoft просто передает ActivationKind как строку MainPage.

 

protected override void OnActivated(IActivatedEventArgs args)
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame == null)
    {
        rootFrame = new Frame();
        Window.Current.Content = rootFrame;
    }
 
    string payload = string.Empty;
    if (args.Kind == ActivationKind.StartupTask)
    { 
        var startupArgs = args as StartupTaskActivatedEventArgs;
        payload = ActivationKind.StartupTask.ToString();
    }
 
    rootFrame.Navigate(typeof(MainPage), payload);
    Window.Current.Activate();
}

 

Затем переопределение главной страницы OnNavigatedTo проверяет эту входящую строку и использует ее для сообщения статуса в пользовательском интерфейсе.

 

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    string payload = e.Parameter as string;
    if (!string.IsNullOrEmpty(payload))
    {
        activationText.Text = payload;
 
        if (payload == "StartupTask")
        {
            requestButton.IsEnabled = false;
            requestResult.Text = "Enabled";
            SolidColorBrush brush = new SolidColorBrush(Colors.Gray);
            requestResult.Foreground = brush;
            requestPrompt.Foreground = brush;
        }
    }
}

 

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

Используя windows.startupTask manifest Extension и StartupTask.RequestEnableAsync API, Ваше приложение может быть настроено для запуска при входе пользователя в систему. Это может быть полезно для приложений, которые пользователь будет использовать на постоянной основе - но эту функцию Вы должны использовать осторожно. Вам не следует использовать эту функцию, если Вы не ожидаете, что пользователь захочет ее использовать для Вашего приложения, и Вам следует избегать многократных уведомлений после того, как пользователь выберет именно Ваше приложение. Включение пользовательского запроса ставит пользователя под Ваше управление, что является улучшением по сравнению с более старой версией Win32.

Пример кода здесь.



Exception: Collection was modified after the enumerator was instantiated.
Posted on 28. July 2017

Windows Store: трейлеры, улучшенные списки, скидки, и другие возможности

Во время Build 2017, Windows Store команда объявила несколько новых функций. Сегодня мы рассотрим этих возможности. 

 

  • Больше способов продвижения приложений и привлечения пользователей
  1. Создание более привлекательных страниц приложений с помощью видео трейлеров
  2. Быстрое создание и обновление страниц приложений с помощью импорта / экспорта
  • Дополнительные способы управления ценами, скидками и продажами
  1. Установка точной даты и времени, когда Ваше приложение должно быть доступно в Store
  2. Более точный контроль Ваших цен и их изменения
  3. Новые более гибкие варианты ценообразования 
  4. Просмотр всех возможных уровней цен в Excel
  • Эффективное отлаживание Ваших приложений с помощью CAB-файлов
  • Dev Center с современными и улучшенными панелями инструментов

Важная информация: если Ваше приложение находится в процессе сертификации, опубликуйте его (или удалите), и следуящая сертификация будет поддерживать новые возможности ценообразования, скидок и обновлений в Store. Кроме того, если Вы используете Windows Store submission API, обязательно прочитайте информацию внизу этой публикации.

Дополнительные способы продвижения приложений и привлечения пользователей

Видео-трейлеры - один из лучших способов привлечения клиентов. Теперь Вы можете загружать до 15 трейлеров на страницы Ваших приложений. При использовании трейлеров обязательно включите изображение с разрешением 1920 x 1080 пикселей (16: 9) в разделе рекламных изображений, которое появляется после прекращения воспроизведения видео. 

Видео трейлеры в Store - см. их здесь на ПК с Windows 10


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

Экспорт и импорт - Страница заполнения приложения для публикации

 

Больше способов управления ценами и продажами

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

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

Доступность расписания - страница ценообразования и доступности


 

Планируйте изменения цены заранее. Например, измените стартовую цену через месяц после публикации приложения.

Планирование изменения цены - страница ценообразования и доступности


 

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

Скидки управляют товарами, покупайте и попробуйте!

Настройка продаж - Страница ценообразования и доступности


 

Как понять цены на разных рынках? Теперь Вы можете просматривать все возможные уровни цен в Excel. Перейдите на страницу «Цены и доступность», выберите таблицу просмотра, и вы можете просматривать и экспортировать таблицу в CSV.

Просмотр всех ценовых уровней - Страница ценообразования и доступности


Использование современных и эффективных панелей инструментов в обновленном Dev Center 

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

Редизайн в Dev Center


Отлаживайте Ваши приложения более эффективно с помощью CAB-файлов

Команда Microsoft получила много отзывов о доступе к файлам CAB, с помощью которых можно отлаживать приложения, а также улучшать качество и производительность Ваших приложений и игр. Отчет о работоспособности позволяет определить, какие конфигурации версий ОС и приложений генерируют большинство сбоев, а также предоставляет ссылки на детали сбоя с отдельными CAB-файлами. Эти CAB файлы доступны только для пользователей, выполняющих любые Windows Insider flights of Windows 10 (медленные или быстрые), поэтому не все отказы будут включать в себя вариант загрузки CAB.

 

 

Вовлечение этих изменений при использовании Windows Store submission API

Если Вы используете Windows Store submission API для управления Вашими приложениями и играми, обратите внимание на следующие пункты:

 

  • Если вы управляете ценами с помощью Submission API, Вам нужно использовать новые уровни цен. Для этого вручную обновите приложение или игру, чтобы Вы могли просматривать новые уровни цен, принимать их и затем обновлять свой API код отправки, чтобы использовать эти новые значения уровня цен, которые можно найти в ценовой таблице по ценообразованию, и также на странице доступности в Dev Center, как описано выше.
  • Windows Store submission API не поддерживает все новые листинговые возможности в Store. Вы можете добавлять новые активы с помощью панели инструментов в Dev Center, а API-интерфейс отправки будет обновлен позднее в июле, чтобы Вы могли управлять этими новыми активами с помощью API. Более подробная информация о будущих возможностях API, включая трейлеры и параметры игр, указана в этой статье.
  • Если Вы используете модуль StoreBroker PowerShell для упрощения использования Windows Store submission API, Вы можете продолжать использовать его для управления теми же типами листинговых активов, которыми управляете сегодня. Однако Вы не сможете загружать новые типы активов с помощью StoreBroker, пока команда StoreBroker не опубликует обновление (примерно через несколько недель).

 

Прочитайте пост в этом блоге, чтобы узнать обо всех недавно добавленных функциях в Store и попробовать все доступные сегодня возможности. Если у Вас возникли трудности с поиском или использованием этих функций, обязательно сообщите, используя ссылку обратной связи в Dev Center (вверху справа от панели инструментов).



Exception: Collection was modified after the enumerator was instantiated.
Posted on 24. July 2017

Новые освещения и PropertySet Interop – XAML и Visual Layer Interop

В предыдушем посте команда пользовательского интерфейса Windows изучала XamlCompositionBrushBase и LoadedImageSurface, чтобы создать пользовательские CompositionBrushes, с помощью которых можно рисовать XAML элементы прямо в Вашей разметке. Сегодня, мы ознакомим Вас с новыми улучшениями, добавленными в XAML и Visual Layer Interop API в Windows 10 Creators Update.

 

В этом посте мы рассмотрим некоторые из этих улучшений Creators Update, а именно новые API:

В Части 1:

 

  • XamlCompositionBrushBase – удобное и простое рисование XAML UIElement с CompositionBrush
  • LoadedImageSurface – легкая загрузка изображений и их использование с помощь Composition API

 

В Части 2: 

 

  • XamlLights – применение освещений в Вашем пользовательском интерфейсе XAML с помощью всего лишь одной строки XAML
  • PointerPositionPropertySet – создание 60 FPS анимаций, используя позицию указателя, из потока пользовательского интерфейса!
  • Включение свойств перевода - оживление элемента пользовательского интерфейса XAML с помощью Composition анимаций

 

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

Осветление интерфейса с XamlLights

Новая великолепная функция в Creators Update - это возможность устанавливать и использовать эффект освещения прямо в XAML с помощью абстрактного класса XamlLight.

Создание XamlLight начинается так же, как и XamlCompositionBrushBase, с помощью метода OnConnected и OnDisconnected (см. Часть 1), но на этой раз источником будет подкласс XamlLight, чтобы создать Ваше собственное уникальное освещение, которое можно использовать прямо в XAML. Microsoft использует это с Reveal эффектом, которые доступен в Creators Update.

Чтобы показать эту возможность в работе, Microsoft разработали демоверсию для создания анимированных GIF, которые показаны выше. Данная демоверсия объединяет все, что Вы уже знаете о XamlCompositionBrushBase и LoadedImageSurface, с добавлением двух XamlLights: HoverLight и AmbientLight.

Начнем с создания AmbientLight: аналогично XamlCompositionBrushBase с помощью метода OnConnected и OnDisconnected. Однако для XamlLight установка свойства CompositionLight подкласса XamlLight.

public class AmbLight : XamlLight
{
    protected override void OnConnected(UIElement newElement)
    {
        Compositor compositor = Window.Current.Compositor;

        // Create AmbientLight and set its properties
        AmbientLight ambientLight = compositor.CreateAmbientLight();
        ambientLight.Color = Colors.White;

        // Associate CompositionLight with XamlLight
        CompositionLight = ambientLight;

        // Add UIElement to the Light's Targets
        AmbLight.AddTargetElement(GetId(), newElement);
    }

    protected override void OnDisconnected(UIElement oldElement)
    {
        // Dispose Light when it is removed from the tree
        AmbLight.RemoveTargetElement(GetId(), oldElement);
        CompositionLight.Dispose();
    }

    protected override string GetId() => typeof(AmbLight).FullName;
}

Охватывающее освещение готово, давайте построим SpotLight XamlLight. Одна из главных задач SpotLight - это следование за указателями пользователя. Для этого можно использовать метод GetPointerPositionPropertySet для ElementCompositionPreview для получения CompositionPropertySet, который можно использовать с помощью Composition ExpressionAnimation (PointerPositionPropertySet более подробно описан в разделе PropertySets ниже).

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

public class HoverLight : XamlLight 
{
    private ExpressionAnimation _lightPositionExpression;
    private Vector3KeyFrameAnimation _offsetAnimation;

    protected override void OnConnected(UIElement targetElement)
    {
        Compositor compositor = Window.Current.Compositor;

        // Create SpotLight and set its properties
        SpotLight spotLight = compositor.CreateSpotLight();
        spotLight.InnerConeAngleInDegrees = 50f;
        spotLight.InnerConeColor = Colors.FloralWhite;
        spotLight.OuterConeAngleInDegrees = 0f;
        spotLight.ConstantAttenuation = 1f;
        spotLight.LinearAttenuation = 0.253f;
        spotLight.QuadraticAttenuation = 0.58f;

        // Associate CompositionLight with XamlLight
        this.CompositionLight = spotLight;

        // Define resting position Animation
        Vector3 restingPosition = new Vector3(200, 200, 400);
        CubicBezierEasingFunction cbEasing = compositor.CreateCubicBezierEasingFunction( new Vector2(0.3f, 0.7f), new Vector2(0.9f, 0.5f));
        _offsetAnimation = compositor.CreateVector3KeyFrameAnimation();
        _offsetAnimation.InsertKeyFrame(1, restingPosition, cbEasing);
        _offsetAnimation.Duration = TimeSpan.FromSeconds(0.5f);

        spotLight.Offset = restingPosition;

        // Define expression animation that relates light's offset to pointer position 
        CompositionPropertySet hoverPosition = ElementCompositionPreview.GetPointerPositionPropertySet(targetElement);
        _lightPositionExpression = compositor.CreateExpressionAnimation("Vector3(hover.Position.X, hover.Position.Y, height)");
        _lightPositionExpression.SetReferenceParameter("hover", hoverPosition);
        _lightPositionExpression.SetScalarParameter("height", 15.0f);

        // Configure pointer entered/ exited events
        targetElement.PointerMoved += TargetElement_PointerMoved;
        targetElement.PointerExited += TargetElement_PointerExited;

        // Add UIElement to the Light's Targets
        HoverLight.AddTargetElement(GetId(), targetElement);
    }

    private void MoveToRestingPosition()
    {
        // Start animation on SpotLight's Offset 
        CompositionLight?.StartAnimation("Offset", _offsetAnimation);
    }

    private void TargetElement_PointerMoved(object sender, PointerRoutedEventArgs e)
    {
        if (CompositionLight == null) return;

        // touch input is still UI thread-bound as of the Creators Update
        if (e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Touch)
        {
            Vector2 offset = e.GetCurrentPoint((UIElement)sender).Position.ToVector2();
            (CompositionLight as SpotLight).Offset = new Vector3(offset.X, offset.Y, 15);
        }
        else
        {
            // Get the pointer's current position from the property and bind the SpotLight's X-Y Offset
            CompositionLight.StartAnimation("Offset", _lightPositionExpression);
        }
    }

    private void TargetElement_PointerExited(object sender, PointerRoutedEventArgs e)
    {
        // Move to resting state when pointer leaves targeted UIElement
        MoveToRestingPosition();
    }

    protected override void OnDisconnected(UIElement oldElement)
    {
        // Dispose Light and Composition resources when it is removed from the tree
        HoverLight.RemoveTargetElement(GetId(), oldElement);
        CompositionLight.Dispose();
        _lightPositionExpression.Dispose();
        _offsetAnimation.Dispose();
    }

    protected override string GetId() => typeof(HoverLight).FullName;
}

Теперь, с помощью HoverLight класса, можно добавить оба AmbLight и HoverLight к предыдущему ImageEffectBrush (смотрите ImageEffectBrush в этом посте):
          

            
                
            
  
            
                
                
            



Примечание: Для добавления XamlLight в разметку, Ваша минимальная SDK-версия должна быть установлена в Creators Update, или же Вы можете установить ее в коде после.
Для получения дополнительной информации об использовании XamlLight перейдите сюда; Вы можете изучить документацию Lighting здесь.

Использование CompositionPropertySets

Если Вы хотите использовать преимущества ScrollViewer Offset или Pointer положения X и Y (например, курсор мыши) для выполнения таких действий, как эффекты анимации, Вы можете использовать ElementCompositionPreview для извлечения PropertySets. Это позволяет создавать удивительно бесперебойные 60 FPS анимации, которые не привязаны к потоку пользовательского интерфейса. Эти методы позволяют вам получать преимущества пользовательского взаимодействия для создания анимаций и освещения.

Использование ScrollViewerManipulationPropertySet

Этот PropertySet полезен для анимации таких объектов, как Parallax, Translation и Opacity.

// Gets the manipulation 
CompositionPropertySet scrollViewerManipulationPropertySet = 
    ElementCompositionPreview.GetScrollViewerManipulationPropertySet(MyScrollViewer);

Чтобы ознакомиться с примером, перейдите к посту о Smooth Interaction и Motion, раздел, посвященный использованию ScrollViewerManipulationPropertySet для управления анимацией.

Использование Нового PointerPositionPropertySet

PointerPositionPropertySet - это новая возможность, добавленная в Creators Update. Этот PropertySet полезен для создания анимаций для освещения и наклона. Также как и ScrollViewerManipulationPropertySet, PointerPositionPropertySet обеспечивает быструю, бесперебойную и зависящую от потока анимацию.

Отличный пример - это механизм анимации Fluent Design RevealBrush, где Вы можете увидить эффекты освещения по бокам UIElements. Этот эффект создается CompositionLight, который имеет свойство Offset, анимированное с помощью ExpressionAnimation, используя значения, полученные из PointerPositionPropertySet.

// Useful for creating an ExpressionAnimation
CompositionPropertySet pointerPositionPropertySet = ElementCompositionPreview.GetPointerPositionPropertySet(targetElement);
ExpressionAnimation expressionAnimation = compositor.CreateExpressionAnimation("Vector3(param.Position.X, param.Position.Y, height)");
expressionAnimation.SetReferenceParameter("param", pointerPositionPropertySet);

Чтобы лучше понять, как использовать эти возможности для того, чтобы внедрить анимации в Ваше приложение, давайте ознакомимся с XamlLights и создадим демоверсию, которая использует PointerPositionPropertySet для анимации SpotLight.

Включение свойства перевода - анимация смещения элемента XAML с использованием анимации композиции

Как уже известно, совместное использование ресурсов между Framework Layer и Visual Layer было достаточно сложным до выпуска Creators Update. Данные визуальные свойства разделяются между UIElements и их Visuals поддержкой:

  • Offset
  • Scale
  • Opacity
  • TransformMatrix
  • InsetClip
  • CompositeMode

До выпуска Creators Update, Scale и Offset были особенно сложными, потому что, как упоминалось ранее, UIElement не знал об изменениях значений свойств на hand-out Visual, даже несмотря на то, что hand-out Visual знал об изменениях в UIElement. Следовательно, если Вы изменяли значение свойства смещения или размера Visual Offset, позиция UIElement также изменялась из-за размера страницы, но все предыдущие значения позиции UIElement следовали всем Вашим визуальным значениям.

С выпуском Creators Update это стало намного легче, поскольку теперь Вы можете предотвратить масштабирование Scale и Offset, добавив новое свойство Translation в Ваш элемент посредством объекта ElementCompositionPreview.

ElementCompositionPreview.SetIsTranslationEnabled(Rectangle1, true);

//Now initialize the value of Translation in the PropertySet to zero for first use to avoid timing issues. This ensures that the property is ready for use immediately.

var rect1VisualPropertySet = ElementCompositionPreview.GetElementVisual(Rectangle1).Properties;
rect1VisualPropertySet.InsertVector3("Translation", Vector3.Zero);

Затем анимируйте визуальную функцию Translation, где ранее Вы анимировали свойство Offset.

// Old way, subject to property stomping:
visual.StartAnimation("Offset.Y", animation);
// New way, available in the Creators Update
visual.StartAnimation("Translation.Y", animation);
Анимируя другое свойство из того, которое было затронуто во время пропусков макета, Вы избегаете нежелательного смещения, исходящего из XAML.

В завершении

В прошлых постах были рассмотрены некоторые новые функции XAML и Composition Interop, а также упрощенные основы использования Composition функций в Вашей XAML разметке.  Начиная от рисования Ваших UIElements с помощью CompositionBrushes и применения подсветки, чтобы выровнять анимацию UIThread. Теперь Composition API становится более доступной, чем когда-либо.
В следующем посте мы расскажем о создании удивительных Composition эффектов и об эволюции Fluent Design.





Posted on 20. July 2017

Вызов WinRT Components из процесса Win32 с помощью Desktop Bridge

В этом посте рассмотрим возможность Desktop Bridge: в частности, о перемещение бизнесс-логики на Windows Runtime Components, также известные как WinRT Components. Раньше Windows поддерживала только вызываемую ОС, обусловленную WinRT компонентами из Win32 приложений. Любая попытка вызвать пользовательские (так называемые сторонние) WinRT компоненты не выполнялась, потому что приложение Win32 не имеет идентификатора пакета и, следовательно, не было способа зарегистрировать компонент с системой во время установки или каким-либо образом найти подходящий компонент для выполнения.

Эти ограничения были устранены, так как приложения Win32 на Desktop Bridge могут быть индивидуальны и зарегистрированы в ОС, включая любые Windows Runtime Components, входящие в состав пакета. В Windows 10 Fall Creators Update, Desktop Bridge поддерживает эту функциональность, включая поддержку как для In-Process Servers, так и Out-Of-Process Servers.

Обмен кодами - Чем WinRT Components лучше других параметров

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

 

  • DLL - для сценариев, требующих производительности proc кода и не требующих межязыковой совместимости
  • WinRT Components – для межъязыковой совместимости или поддержки внепроцессной активации для надежности
  • .Net library – для сценариев, которые работают в proc, и всех клиентов, управляемыми разработчиками, включая PCL или .Net Standard libraries

 

Создание нового или движущегося кода в Windows Runtime Component позволяет повторно использовать код между процессами AppContainer и Win32 в одном пакете. В то время как вы повторно используете существующие библиотеки DLL в вашем процессе AppContainer, вызывая LoadPackageLibrary, переходя к Windows Runtime Component, вы получаете доступ к повторному использованию из-за лучшей совместимости языков (Native C / C ++, управляемый код с C # & VB и Javascript), а также интеграцию Visual Studio через Все ваши проекты. Кроме того, компоненты WinRT поддерживают модель активации вне процесса, которая обеспечивает надежность для вашего приложения.

Как это работает?

Поскольку приложения на Desktop Bridge имеют манифест, записи регистрации для WinRT Component такие же, как и для UWP приложения, с использованием расширений InProcessServer и OutOfProcessServer. Эти расширения регистрируют ActivatableClassId и его бинарную реализацию с вашим пакетом, поэтому, когда ваше приложение пытается активировать класс, система может его найти.

In-Process Servers

Эта функция позволяет разработчикам легко обмениваться кодами между Win32 и UWP приложениями, запущенными в AppContainer, которые могут быть загружены через In-Proc. Компонент построен таким образом, к примеру: Создайте новый проект WinRT Component в VS и его регистрация в манифесте будет точно такой же, как и для внутренних серверов UWP. Поскольку не требуется никакого изменения схемы манифеста, разработчики могут использовать существующие наборы инструментов в VS2015 или VS2017 для сборки In-Proc серверов, но это может быть выполнено только на устройстве с обновлением Fall Creators Update.
Ниже приведен пример регистрации в процессе для C++ WinRT Component, где CPPSimpleMathWinRT.dll является родной реализацией класса SimpleMath.


  
    CPPSimpleMathWinRT.dll
    
  

Ниже вы увидите простой пример Winforms Calculator, который использует C++ WinRT Component для его математического движка.

Как это выглядит во время выполнения:

 

Пример с C++/CX WinRT Component: https://github.com/Microsoft/DesktopBridgeToUWP-Samples/tree/master/Samples/WinFormsWinRTComponent 

Пример с C# WinRT Component: https://github.com/Microsoft/DesktopBridgeToUWP-Samples/tree/master/Samples/WinformsManagedWinRTComponent

 

Out-Of-Process servers

Регистрация OOP-сервера для приложения с использованием расширений Desktop Bridge очень знакома разработчикам, которые ранее регистрировали серверы в UWP. Тем не менее, есть нюансы и ограничения, о которых нужно знать. Так как OOP серверы позволяют вам обмениваться кодами между процессами Win32 и AppContainer, существуют ограничения для совместного использования данных между клиентами - это отражается на модели сервера.  Все зависит от потребностей вашего приложения в отношении того, какую модель стимулирования вы должны использовать.

Инстинктивное поведение сервера определяется требованиями символического процесса, независимо от того, вызывается ли процесс NTCompareToken () и работает ли экземпляр сервера правильно. Если они совпадают, то используется существующий экземпляр сервера. Если они разные, то запускается новый экземпляр сервера.

Одно из ключевых требований - идентификация приложения. Приложения в UWP определены в манифесте, а в большинстве UWP приложений, опубликованных в Windows Store, существует только одно приложение. Но на Desktop Bridge у вас может быть несколько. Еще одним ключевым требованием является уровень доверия вызывающего процесса. На Desktop Bridge, пакет объявлен с возможностью runFullTrust, , который позволяет одному или нескольким приложениям быть объявлеными с  FullTrust entrypoint, EntryPoint=”Windows.FullTrustApplication”. Приложения, использующие FullTrust entrypoint, могут вызывать любой API, который им нужен. Обычно это основной исполняемый файл Win32 / .Net. 

Microsoft ссылаются на эти приложения как на приложения FullTrust.

Если у вас нет этой точки входа, приложение работает на более низком уровне доверия, называемом Base Trust, и имеет дополнительные ограничения в изолированной среде под названием AppContainer, что характерно для приложения при создании приложения UWP в Visual Studio. Эти разные уровни доверия приводят к различным требованиям к признакам процесса, и в результате - к другому экземпляру сервера. Эта модель называется ActivateAsActivator или AAA. Ниже приведен пример этой регистрации, и вы заметите, что это то же самое, что и для UWP приложения; нет ничего нового для использования этой инстинктивной модели для доступа к серверу из вашего Win32 кода:

 

  

  
    Microsoft.SDKSamples.Kitchen.exe
    singleInstance
    
  

 

В то время как модель ActivateAsActivator позволяет обмениваться кодами, создание отдельного экземпляра сервера для каждого клиента может быть немного сложнее. Чтобы облегчить процесс, UWP представил концепцию ActivateAsPackage (AAP), которая обеспечивает одинаковое поведение для серверов в пакете. Это отображено в новом атрибуте IdentityType=”activateAsPackage” в элементе .

Однако существует ограничение в модели AAP, так как вы должны указать, в какой границе доверия вы хотите запустить сервер. Сервер должен быть зарегистрирован для использования процессами AppContainer или FullTrust. Если вы хотите использовать сервер как в процессах FullTrust, так и в AppContainer, вам нужно будет создать и зарегистрировать два сервера с отдельными именами серверов и именами классов, поскольку эти имена должны быть уникальными для каждого пакета. Чтобы зарегистрировать сервер для использования в процессе FullTrust, был добавлен новый атрибут RunFullTrust=”true”. Если вы хотите, чтобы сервер использовался в ваших AppContainer процессах, пропустите данный атрибут.

Оба новых атрибута находятся в пространстве имен xmlns:uap5=”http://schemas.microsoft.com/appx/manifest/uap/windows10/5”. Ниже приведен пример регистрации, показывающий регистрацию Win32 и UWP серверов:

AAP Регистрация сервера для использования процесса Win32, также известного как FullTrust:

  

  
    Microsoft.SDKSamples.Kitchen.exe
    singleInstance
    
  
AAP-регистрация сервера для использования  UWP процессами:

  

  
    Microsoft.SDKSamples.KitchenUWP.exe
    singleInstance
    
  

Образец использует AAP сценарий и показывает два приложения C # Winforms с использованием OOP WinRT Component, в результате чего выполняется только один экземпляр исполняемого файла сервера. WinRT Component представляет собой модифицированную версию образца WRLOutOfProcessWinRTComponent из Universal Windows Samples на github. В этом примере оба клиента вызывают сервер и BakeBread () метод. Из TaskManager можно увидеть, что существует только один экземпляр Сервера.


Ссылка GitHub: https://github.com/Microsoft/DesktopBridgeToUWP-Samples/tree/master/Samples/WinformsOutOfProcessWinRTComponent

Поддержка Visual Studio

В проектах, созданных для этого решения, стоит выделить пару деталей и обходные пути. Прежде всего, Visual Studio в настоящее время не позволяет добавлять ссылки на проекты из проекта WinRT Component в проект Win32 / .Net. Вы можете обойти это, выгрузив проект Win32 / .Net и добавив ссылку на проект прямо в файл проекта, например:

 


  

 

Хотя это добавляет ссылку, вы увидите предупреждение в Visual Studio, поскольку ранее это не поддерживалось. Microsoft продолжает работать с Visual Studio, чтобы улучшать его с каждой новой версией, но пока вы можете игнорировать предупреждение.

Во-вторых, образцы используют UWP JavaScript проект для обработки упаковки приложения. Этот метод отмечен в документе Desktop Bridge Packaging с документацией Visual Studio и работает как разумное решение, до тех пор пока Visual Studio не добавит поддержку. Преимущество этого подхода заключается в том, что вы можете добавить ссылку с вашего компонента WinRT в проект JavaScript, а затем система сборки Visual Studio добавляет соответствующие регистрации для зависимостей пакетов, включая VCLib и .NetNative, а также расширения . Visual Studio не поддерживает добавление регистраций , поэтому вам нужно будет добавить их в манифест вручную.

Сборка на основе метаданных - никаких Proxy/Stub DLL!

Наконец-то, в примере используются приемущества сборки на основе метаданных (Metadata Based Marshaling), которая была представлена в обновлении Windows 10 Anniversary Update (Windows 10 version 1607). Эта функция не привлекла большого внимания, но она позволяет WinRT Component разработчикам не создавать класс proxy / stub, экономя их время и усилия. Это возможно, потому что WinMD развертывается с приложением, и, таким образом, система может идентифицировать и собирать типы кросс-процессов для разработчика. Вы заметите, что код сервера в этом примере не включает прокси-проект и бинарные файлы.

Вывод 

Благодаря Windows Runtime Components и Desktop Bridge разработчики могут сделать еще один шаг на пути к переносу бизнес-логики в UWP. Windows Runtime Components обеспечивают повторное использование кода, которое может работать как с процессами FullTrust, так и с процессами UWP, и они позволяют использовать более широкий межпеременный язык.

Для получения дополнительной информации о Desktop Bridge, перейдите на Windows Dev Center.

 

Ваше приложение уже готово к публикации в Windows Store? Дайте нам знать!