Простой И Естественный Вопрос: Что Такое Библиотеки Uwp?



Простой и естественный вопрос: что такое библиотеки UWP?

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

Кроме того, MSFT в последнее время старается угодить разработчикам различных платформ и языков программирования.

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

Ниже под катом о том, какие библиотеки, как и зачем можно использовать в UWP-приложениях.



Библиотека классов — библиотека классов для приложений Магазина Windows

Библиотека .

Net с классами и методами, доступными для приложений Магазина Windows. Может использоваться только приложениями UWP, написанными на языках .

Net. То есть JavaScript, например, больше не нужен.

Обратите внимание, что само приложение не может использовать обычные библиотеки классов .

Net UWP. Список отличий и изменений, которые необходимо внести при преобразовании кода .

Net в .

Net для приложений Магазина Windows, можно найти здесь: Обзор приложений .

NET для Магазина Windows Изменений и различий довольно много, хотя есть и определенные сходства.

Часто различаются только пространства имен, но методы и свойства остаются прежними.

Это сделано для удобства портирования существующего кода.

Конечно, не все функции .

Net доступны в приложениях Магазина Windows. Частично из соображений безопасности или потому, что не хотели концептуально дублировать это в UWP.

Переносимая библиотека классов — PCL (Portable Class Library)

Эти библиотеки имеют подмножество доступных возможностей в зависимости от выбранной вами платформы.

Целевые платформы выбираются при создании проекта

Простой и естественный вопрос: что такое библиотеки UWP?

Эти целевые платформы можно изменить в любой момент в свойствах проекта.

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

Также их не следует объявлять устаревшими или помечать как исключения.



Компонент среды выполнения Windows

Компонент, который можно использовать с любым языком платформы WinRT. Расширение компонента заканчивается на .

winmd. Но пусть вас это не смущает: компонент очень часто используется как библиотека, а содержащиеся в нем метаданные позволяют ему работать со всеми языками WinRT. Это главное преимущество.

В качестве примера могу показать, как в созданном проекте Библиотеки классов можно через свойства выбрать Runtime Component как результат сборки:

Простой и естественный вопрос: что такое библиотеки UWP?

Но в этом случае вы потеряете межъязыковую совместимость и сможете работать с такой библиотекой только из C# и VB. Компонент времени выполнения основан на COM. Оказывается, можно написать собственный компонент среды выполнения Windows на управляемом языке.

Все языки WinRT используют свои собственные типы данных.

Но в компоненте Runtime данные должны быть унифицированы.

Примитивные типы более или менее схожи во всех языках.

Единственная разница — это JavaScript. Сравнительную таблицу можно найти по следующим ссылкам: Базовые типы данных среды выполнения Windows Сопоставления .

NET Framework типов среды выполнения Windows Языки WinRT различаются и поэтому иногда необходимо прийти к какому-то общему знаменателю.

Например, в приложениях .

Net и JavaScript строки неизменяемы, но в C++ они изменяемы.

В компоненте среды выполнения Windows строки являются неизменяемыми.

Ограничения/правила:

  • Публичные элементы должны быть запечатаны.

  • Открытые классы или интерфейсы не могут быть универсальными или реализовывать интерфейс, отличный от WinRT.
  • Открытые классы не могут быть производными от типов WinRT.
  • Все поля, параметры и возвращаемые значения публичных членов должны иметь тип среды выполнения Windows.
  • Корневое пространство имен должно совпадать с именем сборки и не может начинаться с «Windows».

  • WRC не поддерживает полиморфизм
  • Методы в среде выполнения Windows можно перегружать, но если они имеют одинаковое количество параметров, их необходимо пометить атрибутом.

    Официальный пример:

  
  
  
  
  
  
  
  
  
   

public string OverloadExample(string s) { return s; } [Windows.Foundation.Metadata.DefaultOverload()] public int OverloadExample(int x) { return x; }

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

Net, то лучше выбрать именно эту библиотеку.



Практический пример:

Если ваше приложение UWP использует WebView для отображения веб-сайтов, у вас есть возможность использовать в приложении класс, который будет доступен из JavaScript загруженных веб-страниц.

И этот класс должен находиться внутри компонента Windows Runtime. Вот тут-то и возникает межъязыковая совместимость.

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

Все общедоступные методы таких классов будут доступны со страницы JavaScript, загруженной в WebView. Необходимо только добавить этот класс на страницу в начале навигации с помощью метода Аддвебалловедобжект .

Да, конечно, есть возможность использовать window.external.notify в JS-коде, но существуют определенные ограничения безопасности, которые позволяют осуществлять эти вызовы только с доверенных сайтов https. Немного повторюсь и продублирую пример из MSDN. Добавим метод SomeValueFromJS в класс компонента WinRT.

using Windows.Foundation.Metadata; namespace MyRuntimeComponent { [AllowForWeb] public sealed class MyNativeClass { public void SomeValueFromJS(string value) { } } }

Давайте добавим WebView в XAML.

<WebView x:Name="webView" Source="https:// www.contoso.com/script.htm " NavigationStarting="webView_NavigationStarting"/>

И когда мы начнем навигацию, мы реализуем наш класс на JavaScript.

private void webView_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args) { if (args.Uri.Host == "www.contoso.com") { webView.AddWebAllowedObject("csharpclass", new MyNativeClass()); } }

Теперь из JS-кода вы можете вызвать этот метод следующим образом:

csharpclass.nativeMethod("hello!");

Казалось бы, всё хорошо, но вот незадача, часто может возникнуть необходимость перенести данные на страницу с WebView. Проект с WebView уже ссылается на компонент WinRT, поэтому мы не можем добавить обратную ссылку из-за циклической зависимости.

Ограничения WRC не позволяют нам использовать некоторые опции.

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

Ссылку на эту библиотеку, содержащую класс BridgeClass, можно создать как из основного проекта, так и из проекта компонента среды выполнения Windows.

Простой и естественный вопрос: что такое библиотеки UWP?

Возможности .

Net позволят нам создать доступное событие

public static event Action<string>

и подписаться на событие в основном проекте.

Давайте посмотрим на это в виде кода.

Код BridgeClass:

public class BridgeClass { public static event Action<string> MessageReceived; public static void Broadcast(string message) { if (MessageReceived != null) MessageReceived(message); } }

В основном проекте в коде страницы с WebView подписываемся на событие:

BridgeClass.MessageReceived += ShowMessage;

И давайте реализуем:

void ShowMessage(string msg) { }

Теперь из метода, доступного для JS, мы можем передать значение в C#:

public void SomeValueFromJS(string value) { BridgeClass.Broadcast(value); }

Теги: #uwp #libraries #libraries #WinRT #runtime #comComponent #winmd #webview #Разработка для Windows Phone #Разработка для Windows

Вместе с данным постом часто просматривают: