Posted on 26. March 2019

Начало работы с Windows UI Library

Инструментарий доступен в качестве NuGet пакетов, которые можно добавить в любой существующий или новый проект, используя Visual Studio.

Загрузите и установите Windows UI Library

1. Загрузите Visual Studio 2017 и убедитесь, что Вы выбрали рабочую нагрузку разработки под универсальную Windows платформу в установщике Visual Studio.

Примечание

Visual Studio 2015 не поддерживает Windows UI Library.

2. Откройте существующий проект или создайте новый проект, используя пустой шаблон приложения в Visual C# -> Windows -> Universal, или соответствующий шаблон для языковой проекции.

Обратите внимание: для использования Windows UI Library минимальная версия Вашего проекта должна быть 14393 и выше, а целевая версия должна быть 17134 и выше.

3. На панели Solution Explorer щелкните правой кнопкой мыши на имя Вашего проекта и выберите «Управление NuGet пакетами». Выберите вкладку «Обзор» и найдите Microsoft.UI.Xaml. Затем выберите, какие NuGet пакеты Windows UI Library Вы хотите использовать.

Пакет Microsoft.UI.Xaml содержит Fluent элементы управления и функции, которые подходят для всех приложений.

При желании Вы можете выбрать опцию «Include prerelease», чтобы быть в курсе последних предварительных версий и новых функций.

4. Добавьте Windows UI (WinUI) Theme Resources в Ваши App.xaml ресурсы. Существует два способа, в зависимости от того, есть ли у Вас дополнительные ресурсы приложения.

а. Если у Вас нет других ресурсов приложения, добавьте

<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls"/> в Ваши Application.Resources:

 

    
<Application>
    <Application.Resources>
        <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls"></XamlControlsResources>
    </Application.Resources>
</Application>

 

б. В противном случае, если у Вас несколько наборов ресурсов приложения, добавьте <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls"/> в Application.Resources.MergedDictionaries:

 

 
   <Application>
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <XamlControlsResources  xmlns="using:Microsoft.UI.Xaml.Controls"></XamlControlsResources>
            </ResourceDictionary.MergedDictionaries> 
        </ResourceDictionary>
    </Application.Resources>
</Application>   

 

5. Добавьте ссылку на инструментарий на XAML страницы и на страницы с фоновым кодом.

На Вашей XAML странице добавьте ссылку в самом верху.

XAML: xmlns:controls="using:Microsoft.UI.Xaml.Controls"

В коде (если Вы хотите использовать имена типов без их определения), Вы можете добавить директиву using.

C#: using MUXC = Microsoft.UI.Xaml.Controls;

Дополнительные шаги для C++/WinRT проектов

Когда Вы добавляете NuGet пакет в C++/WinRT проект, этот инструмент генерирует набор заголовков проекции в папке \Generated Files\winrt Вашего проекта. Чтобы добавить эти заголовки в Ваш проект, так чтобы ссылки на эти новые типы разрешались, Вы можете зайти в Ваш pch.h файл и добавить их. Ниже приведен пример, включающий сгенерированные файлы заголовков для Microsoft.UI.Xaml пакета.

 

// pch.h 
... 
#include "winrt/Microsoft.UI.Xaml.Automation.Peers.h" 
#include "winrt/Microsoft.UI.Xaml.Controls.Primitives.h" 
#include "winrt/Microsoft.UI.Xaml.Media.h" 
#include "winrt/Microsoft.UI.Xaml.XamlTypeInfo.h"

 

Вклад в Windows UI Library

WinUI - это проект с открытым исходным кодом, размещенный на GitHub. 

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

Другие источники

Если Вы новичок в UWP разработке, посетите страницы «Начало работы с UWP разработкой» на портале для разработчиков.



Exception: Object reference not set to an instance of an object.
Posted on 12. March 2019

Как переносить настольные приложения на .NET Core 3.0

В этой статье будет рассмотрен перенос настольного приложения с .NET Framework на .NET Core. В качестве примера возьмем WinForms приложение. Шаги для WPF приложения схожи, различия рассмотрим по ходу. Также увидим как использовать WinForms designer в Visual Studio, хотя он находится в стадии разработки и еще не доступен для .NET Core проектов.

О примере

Для этого поста будет использовано игровое Memory-style board приложение. Оно состоит из WinForms UI (MatchingGame.exe) и библиотеки классов с игровой логикой (MatchingGame.Logic.dll), которые предназначены для .NET Framework 4.5. Здесь можно скачать образец. Итак, рассмотрим перенос проекта приложения на .NET Core 3.0, а также библиотеки классов на .NET Standard 2.0. Использование .NET Standard вместо .NET Core позволяет повторно использовать игровую логику для размещения приложения на других платформах, таких как iOS, Android или в вебе.

 

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

Пошаговый процесс

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

Прежде чем переносить приложение на .NET Core 3.0, подготовите следующее:

  1. Установите .NET Core 3 и Visual Studio 2019 Preview версию (Visual Studio 2017 поддерживает версии только до .NET Core 2.2).
  2. Начните с рабочего проекта. Убедитесь, что проект беспроблемно открывается, собирается и запускается.
  3. Обновите NuGet пакеты. Всегда рекомендуется использовать последние версии NuGet пакетов перед любым переносом. Если Ваше приложение ссылается на какие-либо NuGet пакеты, обновите их до последней версии. Убедитесь, что Ваше приложение успешно собрано. Если NuGet выдает ошибки, понизьте версию и найдите последнюю, которая не нарушает Ваш код.
  4. Запустите .NET Portability Analyzer, чтобы определить, существуют ли какие-либо API, от которых зависит Ваше приложение, и которые отсутствуют в .NET Core. Если таковые имеются, Вам необходимо провести рефакторинг своего кода, чтобы избежать зависимостей от API, не поддерживаемых в .NET Core. Иногда можно найти альтернативный API, который обеспечивает необходимую функциональность.
  5. Замените packages.config на PackageReference. Если используются NuGet пакеты, то нужно добавить те же NuGet пакеты в новый .NET Core проект. .NET Core проекты поддерживают только PackageReference для добавления NuGet пакетов. Чтобы переместить ссылки NuGet из packages.config в файл проекта, в обозревателе решений необходимо щелкнуть правой кнопкой на packages.config -> Migrate packages.config в PackageReference… Более детально об этом типе переноса можно ознакомиться по ссылке Migrate from packages.config to PackageReference.

 

Портирование основного проекта

Создание нового проекта
  • Создайте новое приложение того же типа (Console, WinForms, WPF, Class Library), что и приложение, которое нужно перенести, для .NET Core 3. На данный момент были сделаны демонстрационные Visual Studio шаблоны для десктопных проектов, которые находились в стадии разработки, поэтому использовалась консоль.
dotnet new winforms -o \MatchingGame.Core\
  • Скопируйте в файле проекта все внешние ссылки из старого проекта, например:
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
  • Начните сборку. На этом этапе, если пакеты, на которые Вы ссылаетесь, поддерживают только .NET Framework, Вы получите NuGet предупреждение. Если Вы не обновились к последней версии NuGet пакета на шаге 3, попробуйте определить, доступна ли последняя версия, поддерживающая .NET Core (.NET Standard), и повторите обновление. Если более новой версии нет, то .NET Framework пакеты все еще можно использовать, но можно получить ошибки времени выполнения, если эти пакеты имеют зависимости от API, не поддерживаемых в .NET Core. В таком случае рекомендуется сообщить автору NuGet пакета, что Вас заинтересовало бы обновление пакета до .NET Standard. Сделать это можно через контактную форму в NuGet галерее.
Быстрый способ (заменить существующий файл проекта)

Итак, быстрый способ переноса. Убедитесь, что у Вас есть копия текущего .csproj файла, возможно, Вам придется использовать его в будущем. Замените текущий .csproj файл .csproj файлом из проекта, созданного ранее, и добавьте вверху <PropertyGroup> следующее:

<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
Соберите приложение. Если ошибок не возникло, то перенос проекта на .NET Core 3 прошел успешно. Для перемещения зависимого (UI) проекта рекомендуется ознакомиться с разделом «Перенос пользовательского интерфейса»), чтобы узнать, как использовать Designer, ознакомьтесь с разделом «Использование WinForms Designer для проектов .NET Core».

Медленный путь (управляемый перенос)

Если система выдает ошибки, то нужно внести дополнительные корректировки. Здесь предоставлена информация о внесении изменений в код с возможными исправлениями для каждого вопроса. Шаги ниже также помогут лучше понять процесс переноса, поэтому, если быстрый способ помог, но Вам интересно узнать «почему и как», продолжайте читать.
  • Перейдите в.csproj файл в SDK-style. Чтобы переместить приложение в .NET Core, сначала нужно изменить файл проекта в SDK формате, поскольку старый формат не поддерживает .NET Core. Кроме того, SDK-style формат намного проще и с ним легче работать. Убедитесь, что копия текущего .csproj файла создана. Замените содержимое .csproj файла следующим. Для WinForms приложения:
  
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net472</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  </PropertyGroup>
</Project></pre>
Для WPF приложения:

  
    <Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net472</TargetFramework>
    <UseWPF>true</UseWPF>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  </PropertyGroup>
</Project>
Обратите внимание, что значение <GenerateAssemblyInfo> было установлено как false. В проектах нового стиля AssemblyInfo.cs генерируется автоматически по умолчанию. Так что, если проект уже содержит файл AssemblyInfo.cs файл (а он содержит), то необходимо отключить авто-генерацию или удалить файл.

Теперь скопируйте и вставьте все ссылки из старой версии .csproj файла в новую. Например:

Ссылка на NuGet пакет
 
<PackageReference Include="Microsoft.Windows.Compatibility" Version="2.0.1" />
Ссылка на проект
 
<ProjectReference Include="..\MatchingGame.Core\MatchingGame.Core.csproj" />

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

Существует также сторонний инструмент CsprojToVs2017, который может выполнить преобразование. Но после его использования все равно может понадобиться удалить некоторые ссылки вручную, например:
<Reference Include="System.Data.DataSetExtensions"></Reference>
<Reference Include="Microsoft.CSharp"></Reference>
<Reference Include="System.Net.Http"></Reference>

  • Перейдите от .NET Framework к .NET Standard или .NET Core. После успешного преобразования библиотеки в SDK формат, ее можно перенастроить. В данном случае, необходимо, чтобы библиотека классов предназначалась для .NET Standard вместо .NET Core. Таким образом, она будет доступна из любой .NET реализации, если нужно отправить игру на другие платформы (например, iOS, Android или Web Assembly). Для этого замените данную строку
<TargetFramework>net472</TargetFramework>
на следующую

<TargetFramework>netstandard2.0</TargetFramework>
Создайте Ваше приложение. Если Вы используете API, которые не включены в .NET Standard, то могут возникнуть ошибки. Если ошибок нет, то следующие два шага можно пропустить.

  • Добавьте Windows Compatibility Pack для совместимости, если необходимо.Некоторые API, которые не включены в .NET Standard, доступны в Windows пакете совместимости. Если на предыдущем шаге были получены ошибки, то можно проверить, поможет ли Windows пакет совместимости. В рассматриваемом приложении была получена следующая ошибка «Имя реестра не существует в текущем контексте», поэтому в проект был добавлен Microsoft.Windows.Compatibility NuGet пакет. После установки ошибка исчезла.
  • Установите API Analyzer. API Analyzer, доступный в виде NuGet пакета Microsoft.DotNet.Analyzers.Compatibility, предупредит об использовании устаревших API или API, которые не поддерживаются на всех платформах (Windows, Linux, macOS). Если был добавлен пакет совместимости, то рекомендуется добавить и API Analyzer для отслеживания случаев использования API, которые не будут работать на всех платформах. На этом рассмотрение процесса переноса библиотеки классов на .NET Standard заканчивается. Если у Вас есть несколько проектов, которые ссылаются друг на друга, переносите их «снизу вверх», начиная с проекта, который не зависит от других. В данном примере также есть WinForms MatchingGame.exe проект, поэтому теперь необходимо выполнить аналогичные шаги для его переноса в .NET Core.
Перенос пользовательского интерфейса
  • Добавьте .NET Core UI проект. Внедрите в решение новый .NET Core 3.0 UI проект. На данный момент Visual Studio шаблоны для настольных приложений находятся в стадии разработки, поэтому можно просто использовать dotnet CLI.
dotnet new winforms -o \MatchingGame.Core\
Для WPF проектов можно использовать следующее:

dotnet new wpf -o \MatchingGame.Core\
После того, как был создан новый WinForms .NET Core проект, его необходимо добавить в Ваше решение.
  • Свяжите проекты. Сначала удалите все файлы из нового проекта (прямо сейчас он содержит общий Hello World код). Затем свяжите все файлы из существующего .NET Framework UI проекта с .NET Core 3.0 UI проектом, добавив в .csprojfile файл следующую команду.
    
<ItemGroup>
    <Compile Include="..\\**\*.cs" />
    <EmbeddedResource Include="..\\**\*.resx" />
</ItemGroup>
Если у Вас WPF приложение, также необходимо включить .xaml файлы:

  
<ItemGroup>
  <ApplicationDefinition Include="..\WpfApp1\App.xaml" Link="App.xaml">
    <Generator>MSBuild:Compile</Generator>
</ApplicationDefinition>
<Compile Include="..\WpfApp1\App.xaml.cs" Link="App.xaml.cs"></Compile>
</ItemGroup>

<ItemGroup>
  <Page Include="..\WpfApp1\MainWindow.xaml" Link="MainWindow.xaml">
    <Generator>MSBuild:Compile</Generator>
  </Page>
  <Compile Include="..\WpfApp1\MainWindow.xaml.cs" Link="MainWindow.xaml.cs" />
</ItemGroup>
  • Совместите пространство имен по умолчанию и имя сборки. Поскольку Вы ссылаетесь на файлы, созданные дизайнером (например, Resources.Designer.cs), то нужно убедиться, что версия Вашего .NET Core приложения использует то же пространство имен и то же имя сборки. Скопируйте следующие параметры из Вашего .NET Framework проекта:
<PropertyGroup>
    <RootNamespace><!-- (Your default namespace) --></RootNamespace>
    <AssemblyName><!-- (Your assembly name) --></AssemblyName>
</PropertyGroup>
  • Отключите AssemblyInfo.cs файл. Как было отмечено ранее, в проектах нового стиля AssemblyInfo.cs генерируется автоматически по умолчанию. В то же время AssemblyInfo.cs файл из старого WinForms проекта будет скопирован и в новый проект, так как все ** \ *.cs файлы были связаны на предыдущем шаге. Это приведет к дублированию AssemblyInfo.cs. Чтобы избежать этого в файле MatchingGame.Core проекта, для GenerateAssemblyInfo было установлено значение false.
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  • Запустите новый проект. Установите новый .NET Core проект в качестве StartUp проекта и запустите его. Убедитесь, что все работает.
  • Скопируйте или оставьте ссылку. Теперь вместо связывания файлов можно скопировать их из старого .NET Framework UI проекта в новый .NET Core 3.0 UI проект. После этого предыдущий можно удалить.
Использование WinForms Designer для проектов .NET Core

Как было упомянуто выше, WinForms Designer для .NET Core проектов еще не доступен в Visual Studio. Однако есть два способа обойти данный вопрос: 

  1. Сохраните файлы связанными (просто не выполните предыдущий шаг) и скопируйте их, когда будет доступна designer поддержка. Таким образом, можно изменить файлы в старом .NET Framework WinForms проекте, используя designer. И изменения будут автоматически отражены в новом .NET Core WinForms проекте, поскольку они связаны между собой.
  2. Храните два файла проекта в той же директории, где и WinForms проект: старый .csproj файл из существующего .NET Framework проекта и новый .csproj файл в SDK-style нового .NET Core WinForms проекта. Нужно выгрузить и перезапустить проект с соответствующим файлом проекта в зависимости от того, хотите ли Вы использовать designer или нет.
Подведение итогов

В этой статье было показано, как перенести десктопное приложение, содержащее несколько проектов, из .NET Framework на NET Core. Обычно недостаточно просто перенастроить свои проекты на .NET Core. Также были описаны потенциальные проблемы, с которыми Вы можете столкнуться, и способы их решения. Кроме того, было рассмотрено, как можно использовать WinForms designer для портированных приложений, пока он еще не доступен для .NET Core проектов.



Exception: Object reference not set to an instance of an object.
Posted on 12. March 2019

ML.NET 0.11 - Машинное обучение .NET

ML.NET - это кросс-платформенная система машинного обучения с открытым исходным кодом для .NET разработчиков, которая поддерживается на Windows, Linux, macOS. С ML.NET разработчики могут использовать существующие инструменты и наборы разработки и внедрять собственный ИИ в свои приложения, создавая пользовательские модели машинного обучения для распространенных сценариев, таких как анализ чувств, рекомендации, классификация изображений и многое другое!

И вот недавно был объявлен ML.NET 0.11. (ML.NET 0.1 был выпущен в // Сборке 2018). В этом выпуске и во всех последующих выпусках до версии 1.0 основное внимание будет уделено общей стабильности инфраструктуры, продолжая совершенствовать API, исправлять ошибки, уменьшать объем общедоступного API и улучшать документацию и образцы.

Обновления в версии 0.11

  • TensorFlow - это система машинного обучения с открытым исходным кодом, используемая для сценариев глубокого обучения (таких как компьютерное зрение и обработка речи). ML.NET поддерживает использование TensorFlow моделей, до этого поддерживались только сценарии классификации изображений. В версии 0.11 добавлена поддержка ввода текста, поэтому Вы можете использовать TensorFlow модели для анализа текста, такого как анализ настроения. Смотрите подробности и примеры в этом коде.
  • ONNX - это открытый и совместимый формат моделей, который позволяет использовать модели, сделанные в одной среде (например, scikit-learn, TensorFlow, xgboost и т.д.), для использования в другой среде (например, ML.NET). В ML.NET 0.11 Microsoft.ML.ONNX был переименован в Microsoft.ML.ONNXConverter, а Microsoft.ML.ONNXTransorm был переименован в Microsoft.ML.ONNXTransformer, чтобы обозначить различие между ONNX конвертацией и трансформацией.
Фундаментальные изменения в ML.NET 0.11

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

Планируете перейти к сборке?

Если Вы используете ML.NET в Вашем приложении и хотите начать работу, Вы можете проконсультироваться с инженером ML.NET команды:

  • Получить помощь в успешной ML.NET реализации в Вашем приложении.
  • Оставить отзыв о ML.NET.
  • Продемонстрировать Ваше приложение и, возможно, разместить его на домашней ML.NET странице, в .NET блоге или на другом Microsoft ресурсе.

Заполните эту форму и оставьте Вашу контактную информацию, и кто-то из ML.NET команды обязательно свяжется с Вами.

Изучите образцы сообщества и поделитесь собственными!

В ML.NET Samples репозитории также есть специальная страница с образцами сообщества. Эти примеры не поддерживаются Microsoft, но они очень интересны и охватывают дополнительные сценарии, которые Вы еще точно не рассмотрели.

Вот скриншот текущих образцов сообщества:

Делитесь Вашими ML.NET демо версиями и образцами с сообществом, просто отправив в этот репозиторий “Request for your samples!” краткое описание и ссылку на Ваш GitHub репозиторий или публикации в блоге. В итоге, Ваш образец будет опубликован на странице ML.NET Community Samples.

Начните уже сейчас!

Если Вы еще этого не сделали, начните работать с ML.NET здесь.

Затем, подробно изучите другие ресурсы:

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

Источник



Exception: Object reference not set to an instance of an object.
Posted on 7. March 2019

Обновленное соглашение о разработке приложений для Microsoft Store: новая доля прибыли

 

5 марта команда Microsoft Store обновила Соглашение о разработке приложений для Microsoft Store (ADA). В следующий раз, когда Вы войдете в Вашу панель управления (Partner Center), Вам будет предложено повторно принять соглашение о разработке, прежде чем Вы сможете продолжить работу с панелью.

Обновленное соглашение содержит новую структуру платежей в Microsoft Store, которая обеспечивает до 95 процентов дохода для разработчиков потребительских приложений. Чтобы получить полный 95-процентный доход, обязательно указывайте СИД в Ваших ссылках трафика.

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

Если покупка не содержит СИД-идентификатор, в случае установки приложения с помощью веб-поиска, Вы получаете 95-процентный доход.

Новая структура оплаты применяется к покупкам приложений на всех ПК под управленим Windows 10, Windows Mixed Reality, Мобильных и Surface Hub устройствах. Новая структура не относится ко всем играм и любым покупкам на Xbox консолях.

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

Источник



Exception: Object reference not set to an instance of an object.
Posted on 28. February 2019

Обновление C# версий и C# инструментов

 

Начиная с Visual Studio 2019 Preview 4 и RC, будет настроен способ обработки C# версий в .NET инструментах.

Итоги изменений

Во-первых, были добавлены два новых значения языковой версии (LangVersion): LatestMajor и Preview. Вот как они соответствуют поддерживаемому на данный момент списку значений:

LangVersion - Значение

LatestMajor - Последняя поддерживаемая C# версия

Preview - Последний доступный предварительный просмотр языковой C# версии

Latest - Последняя поддерживаемая языковая  C# версия (включая дополнительную версию)

ISO-1 - C# 1.0/1.2

ISO-2 - C# 2.0

3 - C# 3.0

4 - C# 4.0

5 - C# 5.0

6 - C# 6.0

7 - C# 7.0

7.1 - C# 7.1

7.2 - C# 7.2

7.3 - C# 7.3

8.0 - C# 8.0

Если LangVersion не указана, значение по умолчанию будет определяется целевой структурой Вашего проекта. Если Вы нацелены на структуру предварительного просмотра, которая также имеет соответствующую C# версию предварительного просмотра, эта версия будет использоваться по умолчанию. Если Вы не нацелены на предварительный просмотр, то выбирается Latest.

C# 8.0 в предварительном просмотре

Следующие сценарии объясняют, как дефолтная C# версия будет интерпретироваться, пока C# 8.0 все еще находится в режиме предварительного просмотра.

Предварительный просмотр netcoreapp3.0 preview или netstandard2.1

Дефолтная языковая версия в этом сценарии будет в качестве предварительного просмотра. Функции C# 8.0, к которым у Вас есть доступ, полностью основаны на используемой Вами версии компилятора (и, следовательно, .NET SDK). При использовании будущих предварительных просмотров Вы сможете получить еще больше функций. При сборки .NET SDK проекта Вы увидете уведомление о том, что это все еще предварительный просмотр.

.NET Framework

Дефолтная языковая версия, выбранная в этом сценарии, является Latest. Использование любой C# 8.0 функции будет ошибкой компиляции. Инструменты Visual Studio предложат Вам быстрое исправление, которое может изменить языковую версию проекта или решения при обнаружении одной из этих ошибок. Поскольку для некоторых функций требуются базовые типы или функции времени выполнения, которые недоступны в .NET Framework, такие как Default Interface Members, Вы все равно можете получить ошибку при ориентировке на .NET Framework.

Многоцелевой предварительный просмотр netcoreapp3.0 или netstandard2.1 и .NET Framework

Для таргетинга предварительного просмотра netcoreapp3.0/netstandard2.1 языковой версией будет Preview. При сборке из .NET SDK выдается предупреждение. Для таргетинга .NET Framework языковая версия является Latest.

Explicit LangVersion

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

Если C# 8.0 и .NET Core 3.0 - GA

В конце концов, C# 8.0 и .NET Core 3.0 будут выпущены в версии GA-качества. Вот как соответствующие значения LangVersion будут сопоставляться:

LangVersion - Значение

Latest - 8.0

LatestMajor - 8.0

Preview - Еще не определен

Проекты, в которых не указана LangVersion, будут обрабатываться так, как если бы они были Latest, а C# 8.0 была бы GA.

Если Вы создали проект для C# 8.0 предварительного просмотра с таргетингом на предварительный просмотр .NET Core 3.0 или .NET Standard 2.1, а также не указали LangVersion, это будет так, как если бы Latest уже выбрано. Вы не получите доступ к Preview ни в каком сценарии, если C# 8.0 и .NET Core 3.0 будут GA.

Во время написания кода нету предварительного просмотра C#, когда C# 8.0 - GA. В дальнейшем, предварительный просмотр будет доступен, Вы сможете прочитать об этом в будущих блог постах.

Основная причина

До этого момента дефолтная C# версия, используемая в Visual Studio, была эквивалентна LatestMajor. Это было проблематично по двум причинам:

 

  1. C# теперь развертывается между циклами Visual Studio, но новые проекты в Visual Studio по-прежнему будут использовать более старую C# версию по умолчанию.
  2. Предварительный просмотр C# 8.0 является лучшим выбором для проектов, нацеленных на предварительный просмотр .NET Core 3.0, но раньше не было никакой возможности сделать его по умолчанию без того, чтобы сделать его по умолчанию для проектов, которые не нацелены на предварительный просмотр .NET Core 3.0.

 

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

Поддержка и совместимость функций предварительного просмотра

Использовать функции предварительного просмотра C# 8.0 в выпущенной Visual Studio 2019 версии не так просто, поскольку существуют проблемы поддержки и совместимости функций предварительного просмотра и уже выпущенных функций:

 

  • Любая функция или поведение версии C# 7.3 и ниже полностью поддерживается и полностью совместима.
  • Любая функция предварительного просмотра C# 8.0 не поддерживается.
  • Нет гарантии совместимости от одного предварительного просмотра C# 8.0 к другому.

 

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



Exception: Object reference not set to an instance of an object.
Posted on 26. February 2019

.NET Core 1.0 и 1.1 перестанут работать 27 июня 2019 года

.NET Core 1.0 был выпущен 27 июня 2016 года, а .NET Core 1.1 был выпущен 16 ноября 2016 года. .NET Core 1.0 поддерживается в течение трех лет, как LTS-версия. .NET Core 1.1 входит в тот же период времени, что и .NET Core 1.0. .NET Core 1.0 и 1.1 перестанут поддерживаться 27 июня 2019 года, спустя три года после первоначального выпуска .NET Core 1.0.


С 27 июня 2019 года обновления .NET Core больше не будут включать обновленные пакеты или изображения контейнеров для .NET Core 1.0 и 1.1. Вы должны заранее запланировать обновление с .NET Core 1.x до .NET Core 2.1 или 2.2.

Обновление до .NET Core 2.1

Поддерживаемый путь обновления .NET Core 1.x приложений через .NET Core 2.1 или 2.2. Инструкции по обновлению можно найти в этих документах:
Примечание. Документация по переходу с .NET Core 2.0 на 2.1, в равной степени применима к переходу с .NET Core 1.x на 2.1.

.NET Core 2.1 является выпуском долгосрочной поддержки (LTS). Рекомендуется сделать .NET Core 2.1 Вашим новым стандартом для .NET Core разработки, особенно для приложений, которые не часто обновляются.

По состоянию на 1 октября 2018 года .NET Core 2.0 уже вышел из строя. Важно перенести приложения как минимум на .NET Core 2.1.

Политика поддержки Microsoft

У Microsoft есть политика поддержки для .NET Core. Она включает в себя политики для двух типов релизов: LTS и текущего.

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

 .NET Core политика жизненного цикла поддерживаемых ОС определяет, какие версии Windows, macOS и Linux поддерживаются для каждого .NET Core выпуска.



Exception: Object reference not set to an instance of an object.
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. Если у Вас есть идеи по добавлению новых функций, пожалуйста, отправьте Ваш запрос!



Exception: Object reference not set to an instance of an object.
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.

 

Источник



Exception: Object reference not set to an instance of an object.
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 директивы), так и на уровне проекта. Также была изменена подписка на файл проекта к <NullableContextOptions> enable </NullableContextOptions>.

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

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

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

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


 




Exception: Object reference not set to an instance of an object.
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.

 



Exception: Object reference not set to an instance of an object.