Простий, природний питання: які бувають бібліотеки UWP?



Повторне використання коду і сумісність під різні платформи в наш час досить актуальне питання. Крім того MSFT останнім часом намагається догодити розробникам різних платформ і мов програмування. Саме тому, ймовірно, можливості універсальної платформи Windows дозволяють використовувати не один тип бібліотек. Під катом про те, які бібліотеки, як і навіщо можна використовувати в додатках UWP.

Бібліотека класів — Class Library для додатків Windows Store

.Net бібліотека з класами і методами, доступними для додатків Windows Store apps. Може бути використана тільки UWP додатками, написаними мовами .Net. Тобто, JavaScript, наприклад, відпадає.

Зауважте, що звичайні .Net бібліотеки класів UWP додаток само собою використовувати не може.
Список відмінностей і змін, які необхідно зробити при конвертації коду .Net в .Net додатків для Windows Store ви можете знайти за посиланням: .NET for Windows Store apps overview

Змін і відмінностей досить багато, хоча спостерігається і певна схожість. Найчастіше відрізняються тільки простору імен, а методи і властивості залишаються незмінними. Це зроблено для зручності портування існуючого коду. Зрозуміло, не весь функціонал .Net доступний в додатках Windows Store. Частково з міркувань безпеки або ж з-за того, що його концептуально не захотіли дублювати в UWP.

Бібліотека класів переноситься — PCL (Portable Class Library)

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



Ці цільові платформи можна змінити в будь-який момент у властивостях проекту.
Так як код буде один для декількох платформ, то всі типи та члени повинні бути присутніми в обраних платформах і не повинні мати ніякої специфіки платформи. Також вони не повинні бути deprecated або позначеними на виключення.

Компонент середовища виконання Windows -Windows Runtime Component

Компонент, який може використовуватися з будь-якою з мов платформи WinRT. Розширення у компонента закінчується на .winmd. Але нехай вас це не плутає, компонент дуже часто все-таки використовується як бібліотека, а метадані, які він містить дозволяють йому працювати з усіма мовами WinRT. Це і є основним плюсом.

Для прикладу можу показати вам як в створеному проекті Class Library через властивості можна вибрати Runtime Component як результату побудови:



Але в цьому випадку ви втратите крос-мовну сумісність і зможете працювати з такою бібліотекою тільки з C# і VB.

Runtime Component заснований на COM. Виходить, що є можливість написати нативний Windows Runtime компонент на managed мовою.
У всіх мовах WinRT використовуються свої типи даних. Але в Runtime компоненті дані повинні бути уніфіковані.
Примітивні типи більш-менш схожі у всіх мовах. Відрізняється більшою частиною тільки JavaScript.
Таблицю зіставлення можна знайти за посиланнями:
Windows Runtime base data types
.NET Framework mappings of Windows Runtime types

Мови WinRT розрізняються і тому іноді необхідно приходити до якогось спільного знаменника. Наприклад, в .Net і JavaScript додатках рядка незмінні (immutable), а у C++ вони mutable. У вікні Windows Runtime рядка immutable.

Обмеження/правила:
  • Публічні елементи повинні бути обов'язково запечатані (sealed).
  • Публічні класи або інтерфейси не можуть бути generic або реалізовувати не WinRT інтерфейс.
  • Публічні класи не можуть бути похідними від WinRT типів.
  • Всі поля, параметри і значення, що повертаються публічних членів повинні бути типу Windows Runtime.
  • Корінне простір імен має відповідати назві збірки і не може починатися з «Windows».
  • WRC не підтримує поліморфізм
  • Методи в Windows Runtime можуть бути перевантажені, але у випадку однакової кількості параметрів вони повинні бути позначені атрибутом. Офіційний приклад:
public string OverloadExample(string s)
{
return s;
}
[Windows.Foundation.Metadata.DefaultOverload()] 
public int OverloadExample(int x)
{
return x;
}

В Class Library для додатків Windows Store менше обмежень, тому якщо у вас на додаток .Net мовами, то краще вибирати цю бібліотеку.

Практичний приклад:

Якщо ваше UWP додаток використовує WebView для відображення веб-сайтів, то у вас є можливість використовувати в додатку клас, який буде доступний з JavaScript-а завантажених веб сторінок.
І ось цей клас повинен знаходиться всередині Windows Runtime. Ось де необхідна крос-мовна сумісність.

Створюється компонент, і з основного проекту, що містить сторінку WebView на нього робиться посилання. Всередині компонента публічний клас або класи можуть бути позначені атрибутом [AllowForWeb]. Всі публічні методи таких класів будуть доступні з JavaScript завантаженої в WebView сторінки. Необхідно тільки при початку навігації на сторінку додати цей клас за допомогою методу AddWebAllowedObject.

Так, звичайно, є варіант використовувати window.external.notify в коді JS, але є певні обмеження безпеки, які дозволяють виконання цих викликів тільки з довірених https сайтів.

Трохи повторюся і продублюю приклад з MSDN. В клас WinRT компонента додамо метод SomeValueFromJS

using Windows.Foundation.Metadata;

namespace MyRuntimeComponent
{
[AllowForWeb]
public sealed class MyNativeClass
{
public void SomeValueFromJS(string value)
{

}
}
} 

В XAML додамо WebView

<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 не дозволяють нам використовувати деякі варіанти. В якості рішення можна створити проміжний шар у вигляді бібліотеки Class Library для додатків Windows Store у якій обмежень набагато менше. Посилання на цю бібліотеку містить клас з назвою BridgeClass можна зробити і з основного проекту та з проекту Windows Runtime.



Можливості .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);
}
}

В основному проекті, code-behind сторінки з WebView підписуємося на подію:

BridgeClass.MessageReceived += ShowMessage;

І реалізуємо:

void ShowMessage(string msg)
{
}

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

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

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.