Выбор компонентов среды выполнения Windows по сравнению с переносимой библиотекой кода
При совместном использовании кода между Windows Phone 8 и Windows 8 два основных варианта для разработчиков: 1) компоненты среды выполнения Windows и 2) библиотеки классов портала.
Компоненты среды выполнения Windows используют WinRT и могут проецироваться на все поддерживаемые языки. Они требуют связанных файлов в отдельных проектах (бинарных файлах) при использовании на разных платформах. Они, однако, разделяют 90% доступных API WinRT.
Переносимые библиотеки классов являются подмножеством (иногда значительным подмножеством) BCL, которое имеет двоичную совместимость на разных платформах. Их можно использовать в приложениях WinRT, а также в других типах проектов, таких как Silverlight, Xbox и т. Д.
Когда разработчик выбирает "стратегию совместного использования", какой тип проекта является наиболее подходящим для достижения наилучшего результата при совместном использовании кода между Windows Phone 8 и Windows 8? Благодарю.
4 ответа
Если вы хотите обмениваться кодом между Windows Phone 8 и Windows 8, то вы не можете использовать компоненты среды выполнения Windows, поскольку для Windows 8 используются разные компоненты, и они отличаются для Windows Phone 8 и не являются взаимозаменяемыми.
Я бы выбрал Portable Class Libraries для некоторых простых универсальных библиотек или для совместного использования кода по ссылкам и директивам компиляции #if WP8 - это просто работает и является более мощным, чем Portable libs.
Помните также, что на большинство внешних библиотек, таких как MVVM Light, нельзя ссылаться в Portable Libs, поэтому, если вы хотите их использовать, вы должны использовать общий доступ к коду через ссылки на файлы.
Это зависит от того, какая форма обмена вам нужна:
1) Если у вас есть общий уровень бизнес-логики C++, вы можете использовать компоненты среды выполнения Windows (WinRT), чтобы показать это как Windows Phone, так и приложению Windows Store (это единственный вариант использования для Windows Phone, поскольку вы не можете написать приложение WP8 используя JavaScript или используйте.NET для создания компонента WinRT).
Однако вам придется создать два отдельных компонента WinRT: один для телефона и один для магазина Windows. Должна быть возможность поделиться кодом C++/CX вашего уровня взаимодействия WinRT, используя директивы препроцессора (#if
) для обозначения кода платформы.
2) У вас есть бизнес-логика в C#/VB, которая зависит только от API.NET, которые доступны в Portable Class Library. Затем вы можете использовать Portable Class Library (PCL), чтобы содержать эту логику. По сути, если вы можете встроить свою библиотеку в библиотеку PCL, тогда это должно работать. Затем вы можете ссылаться на этот PCL в двоичном виде в приложении Windows Phone и Windows Store.
Однако, как сказал Мартин, вам нужно соблюдать осторожность при использовании сторонних библиотек, так как они также должны быть собраны для PCL. Некоторые сторонние библиотеки уже доступны в форме PCL (например, JSON.NET).
3) Вы хотите поделиться кодом, который имеет зависимости API платформы (или сторонние библиотеки), которые не поддерживаются PCL. Затем вам нужно будет создать отдельные библиотеки DLL, по одной для каждой платформы. Вы можете избежать дублирования кода, используя связанные исходные файлы C#/VB и используя флаг сборки (#if
еще раз), чтобы позволить небольшие изменения кода между целевыми платформами.
Этот вопрос больше не относится к выпуску универсальных приложений Windows Phone 8.1 в Visual Studio 2013, обновление 2, которое поддерживает общие проекты.
Подождите немного, так как для меня даже в Visual Studio 2013 Update 4 этот вопрос все еще актуален, потому что там есть два типа проектов:
Библиотека классов (портативная для универсальных приложений) - PCL
а также
Компонент времени выполнения Windows (портативный для универсальных приложений) - WinMD
Я вижу только одно большое различие между ними: WinMD использует только WinRT, и PCL можно использовать также с.Net и Silverlight. Но я также хочу узнать больше о том, какой и когда лучше выбрать.
Некоторые инструкции о том, как эффективно использовать переносимые библиотеки классов для совместного использования кода между платформами, см. В этом блоге: Как заставить переносимые библиотеки классов работать на вас