Выбор компонентов среды выполнения Windows в сравнении с переносимой библиотекой кода

При совместном использовании кода между Windows Phone 8 и Windows 8 разработчики могут использовать два основных варианта: 1) компоненты среды выполнения Windows и 2) библиотеки классов портала.

Компоненты среды выполнения Windows используют WinRT и могут быть проецированы на все поддерживаемые языки. Для них требуются связанные файлы в отдельных проектах (двоичные файлы) при использовании на разных платформах. Однако они совместно используют 90 % доступных WinRT API.

Переносимые библиотеки классов являются подмножеством (иногда значительным подмножеством) BCL который имеет бинарную совместимость на разных платформах. Их можно использовать в приложениях WinRT, а также в проектах других типов, таких как Silverlight, Xbox и т. д.

Когда разработчик выбирает «стратегию совместного использования», какой тип проекта лучше всего подходит для создания наилучшего кода для совместного использования между Windows Phone 8 и Windows 8? Спасибо.


person Jerry Nixon    schedule 26.11.2012    source источник
comment
Кроме того, существует метод связывания исходных файлов... без компонентов WinRT или PCL.   -  person Filip Skakun    schedule 27.11.2012
comment
Этот вопрос больше не актуален с появлением универсальных приложений Windows Phone 8.1 в Visual Studio 2013 Update 2, которые поддерживают общие проекты.   -  person Jerry Nixon    schedule 14.05.2014
comment
@JerryNixon-MSFT - это интригующая жемчужина мудрости, не могли бы вы немного расширить ее? Как работает «саред проект» и какую проблему он решает?   -  person Tim Long    schedule 31.10.2015


Ответы (4)


Если вы хотите разделить код между Windows Phone 8 и Windows 8, вы не можете использовать компоненты среды выполнения Windows, потому что для Windows 8 используются разные компоненты, а для Windows Phone 8 — разные, и они не взаимозаменяемы.
Я бы выбрал либо переносимые библиотеки классов для некоторых простых универсальных библиотек, либо для совместного использования кода с помощью ссылок и директив компиляции #if WP8 — это просто работает и более мощно, чем переносимые библиотеки.
Имейте в виду, что большинство внешних библиотек, таких как MVVM Light, не могут быть упоминаются в Portable Libs, поэтому, если вы хотите их использовать, вам нужно использовать совместное использование кода через ссылки на файлы.

person Martin Suchan    schedule 27.11.2012
comment
На самом деле существует PCL-версия MVVM Light — пакет NuGet называется Portable.MvvmLightLibs, а источник находится здесь: mvvmlight.codeplex.com/SourceControl/network/forks/onovotny/ - person Claire Novotny; 05.01.2013
comment
@Martinsuchan. Если вы хотите поделиться кодом между Windows Phone 8 и Windows 8, вы не можете использовать компоненты среды выполнения Windows... Зависит от того, что вы подразумеваете под общим кодом. Вы не можете создать один проект WRC, предназначенный как для WinRT, так и для WP8, но вы можете создать по одному для каждого, и оба проекта могут ссылаться на один и тот же исходный код C/C++. . - person Scott Smith; 02.09.2013
comment
@Мартин Сучан и @Скотт Смит, вы уверены? Потому что есть вариант шаблона Windows Runtime Component (Portable for Universal Windows 8.1). В описании указано: Проект по созданию управляемого компонента среды выполнения Windows для приложений Windows и Windows Phone независимо от языков программирования, на которых написаны приложения. - person bunkerdive; 23.12.2015
comment
@bunkerdrive - Недавно появился Universal; мой пост от 2013 года. - person Scott Smith; 25.12.2015

Это зависит от того, какая форма обмена вам нужна:

1) Если у вас есть общий уровень бизнес-логики C++, вы можете использовать компоненты среды выполнения Windows (WinRT), чтобы представить его как для Windows Phone, так и для приложения Магазина Windows (это единственный вариант использования Windows Phone, поскольку вы не может написать приложение WP8 с помощью JavaScript или использовать .NET для создания компонента WinRT).

Однако вам придется создать два отдельных компонента WinRT, один для телефона и один для Магазина Windows. Должна существовать возможность совместного использования кода C++/CX уровня взаимодействия WinRT с помощью директив препроцессора (#if), чтобы пометить код, зависящий от платформы.

2) У вас есть бизнес-логика на C#/VB, которая зависит только от API-интерфейсов .NET, доступных в переносимой библиотеке классов. Затем вы можете использовать переносимую библиотеку классов (PCL) для хранения этой логики. По сути, если вы можете встроить свою библиотеку в PCL DLL, это должно сработать. Затем вы можете ссылаться на этот PCL в двоичной форме как в Windows Phone, так и в приложении Windows Store.

Однако, как сказал Мартин, вам нужно соблюдать осторожность при использовании сторонних библиотек, поскольку они также должны быть созданы для PCL. Некоторые сторонние библиотеки уже доступны в форме PCL (например, JSON.NET).

3) Вы хотите предоставить общий доступ к коду, который имеет зависимости API платформы (или зависимости сторонних библиотек), которые не поддерживаются PCL. Тогда вам потребуется создать отдельные библиотеки DLL, по одной для каждой платформы. Вы можете избежать дублирования кода, используя связанные исходные файлы C#/VB, и использовать флаг сборки (снова #if), чтобы разрешить небольшие изменения кода между вашими целевыми платформами.

person Paul Annetts    schedule 27.11.2012

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

person Daniel Plaisted    schedule 06.12.2012

Этот вопрос больше не актуален с появлением универсальных приложений Windows Phone 8.1 в Visual Studio 2013 Update 2, которые поддерживают общие проекты.

Минуточку, как по мне даже в Visual Studio 2013 Update 4 этот вопрос все еще актуален, потому что там есть два типа проектов:

Библиотека классов (переносимая для универсальных приложений) — PCL

а также

Компонент среды выполнения Windows (переносимый для универсальных приложений) — WinMD

Я вижу только одно большое различие между ними: WinMD использует только WinRT, а PCL можно использовать также с .Net и Silverlight. Но я также хочу узнать больше о том, какой из них и когда лучше выбрать.

person Alexej Sommer    schedule 24.03.2015
comment
Visual Studio 2014 Community Edition предоставляется бесплатно. Кроме того, Visual Studio 2015 Community Edition будет бесплатным. Я рекомендую вам обновить Visual Studio, если ваша ситуация позволяет вам это сделать. - person Jerry Nixon; 31.03.2015