Кроме того, MSFT в последнее время старается угодить разработчикам различных платформ и языков программирования.
Вероятно, поэтому универсальная платформа Windows позволяет использовать более одного типа библиотек.
Ниже под катом о том, какие библиотеки, как и зачем можно использовать в UWP-приложениях.
Библиотека классов — библиотека классов для приложений Магазина Windows
Библиотека .Net с классами и методами, доступными для приложений Магазина Windows. Может использоваться только приложениями UWP, написанными на языках .
Net. То есть JavaScript, например, больше не нужен.
Обратите внимание, что само приложение не может использовать обычные библиотеки классов .
Net UWP. Список отличий и изменений, которые необходимо внести при преобразовании кода .
Net в .
Net для приложений Магазина Windows, можно найти здесь:
Обзор приложений .NET для Магазина Windows
Изменений и различий довольно много, хотя есть и определенные сходства.Часто различаются только пространства имен, но методы и свойства остаются прежними.
Это сделано для удобства портирования существующего кода.
Конечно, не все функции .
Net доступны в приложениях Магазина Windows. Частично из соображений безопасности или потому, что не хотели концептуально дублировать это в UWP.
Переносимая библиотека классов — PCL (Portable Class Library)
Эти библиотеки имеют подмножество доступных возможностей в зависимости от выбранной вами платформы.
Целевые платформы выбираются при создании проекта
Эти целевые платформы можно изменить в любой момент в свойствах проекта.
Поскольку код будет одинаковым для нескольких платформ, все типы и члены должны присутствовать на выбранных платформах и не должны иметь какой-либо специфичности платформы.
Также их не следует объявлять устаревшими или помечать как исключения.
Компонент среды выполнения Windows
Компонент, который можно использовать с любым языком платформы WinRT. Расширение компонента заканчивается на .winmd. Но пусть вас это не смущает: компонент очень часто используется как библиотека, а содержащиеся в нем метаданные позволяют ему работать со всеми языками WinRT. Это главное преимущество.
В качестве примера могу показать, как в созданном проекте Библиотеки классов можно через свойства выбрать Runtime Component как результат сборки:
Но в этом случае вы потеряете межъязыковую совместимость и сможете работать с такой библиотекой только из C# и VB.
Компонент времени выполнения основан на COM. Оказывается, можно написать собственный компонент среды выполнения Windows на управляемом языке.
Все языки WinRT используют свои собственные типы данных.
Но в компоненте Runtime данные должны быть унифицированы.
Примитивные типы более или менее схожи во всех языках.
Единственная разница — это JavaScript. Сравнительную таблицу можно найти по следующим ссылкам: Базовые типы данных среды выполнения Windows Сопоставления .
NET Framework типов среды выполнения Windows Языки WinRT различаются и поэтому иногда необходимо прийти к какому-то общему знаменателю.
Например, в приложениях .
Net и JavaScript строки неизменяемы, но в C++ они изменяемы.
В компоненте среды выполнения Windows строки являются неизменяемыми.
Ограничения/правила:
- Публичные элементы должны быть запечатаны.
- Открытые классы или интерфейсы не могут быть универсальными или реализовывать интерфейс, отличный от WinRT.
- Открытые классы не могут быть производными от типов WinRT.
- Все поля, параметры и возвращаемые значения публичных членов должны иметь тип среды выполнения Windows.
- Корневое пространство имен должно совпадать с именем сборки и не может начинаться с «Windows».
- WRC не поддерживает полиморфизм
- Методы в среде выполнения Windows можно перегружать, но если они имеют одинаковое количество параметров, их необходимо пометить атрибутом.
Официальный пример:
Библиотека классов для приложений Магазина Windows имеет меньше всего ограничений, поэтому если у вас приложение на языках .public string OverloadExample(string s) { return s; } [Windows.Foundation.Metadata.DefaultOverload()] public int OverloadExample(int x) { return x; }
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.
Возможности .
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
-
Берцелиус, Йёнс Якоб
19 Oct, 24 -
Простая Настройка Asterisk + Fail2Ban
19 Oct, 24 -
Symbian – Самая Популярная Ос В Мире?
19 Oct, 24 -
Выпуск Richfaces 3.3.0 Ga
19 Oct, 24