Конфигурации и платформы в WinRT

136

На стандартной панели инструментов Visual Studio находятся два поля со списком, которые можно узнать по всплывающим подсказкам «Solution Configurations» и «Solution Platforms». Список Solution Configurations содержит три варианта:

Debug
Release
Configuration Manager...

Первые два варианта выбирают режим компилирования программы. Обычно в ходе разработки используется отладочная конфигурация (Debug). Но когда процесс отладки будет завершен, лучше переключиться на рабочую конфигурацию (Release), улучшающую эффективность и быстродействие кода.

Во всех проектах, предшествовавших EnumerateFonts, который мы создали в предыдущей статье, список Solution Platforms состоит из пяти вариантов:

Any CPU
ARM
x64
x86
Configuration Manager...

Обычно в этих проектах поле Solution Platforms содержит Any CPU — значение по умолчанию для проектов C#.

При компилировании программы C# в Visual Studio исходный код преобразуется на язык IL (Intermediate Language). При выполнении программы код IL компилируется в машинный код, соответствующий процессору, на котором выполняется программа. Это одно из больших преимуществ управляемых языков, к которым относится C#: исполняемый файл содержит код IL, не зависящий от процессора, на котором выполняется программа, даже если она использует P/Invoke для вызова функций Win32.

В проектах C# разработчик может выбрать в поле со списком Solution Platforms платформу ARM, x64 или x86. Компилятор по-прежнему генерирует код IL, но исполняемый файл будет работать только на конкретных процессорах. Если выбрать вариант ARM, программа будет выполняться только на компьютерах с процессором ARM, а если выбрать x64 — она будет выполняться только на 64-разрядных процессорах Intel. В режиме x86 программа будет выполняться как на 32-разрядных, так и на 64-разрядных процессорах Intel.

Как правило, программы C# не должны ограничиваться конкретными процессорами (если только у вас нет для этого конкретных причин) — в списке Solution Platforms должна быть выбрана строка Any CPU. (Если программа должна по-разному работать на процессорах Intel и ARM, используйте функцию GetNativeSystemInfo, описанную ранее.)

Однако с включением кода C++ в приложение ситуация меняется. Visual Studio не компилирует код C++ в код IL; он преобразуется в машинный код для конкретного процессора. Исполняемый файл будет выполняться только на процессоре этого типа, с одним исключением: код, откомпилированный для 32-разрядного процессора Intel, также будет работать на 64-разрядных процессорах Intel.

Кроме того, в гибридных приложениях, содержащих код C# и C++ (как приложение EnumerateFonts), платформы разных проектов должны соответствовать платформе, на которой приложение будет выполняться. Казалось бы, проект C# в режиме Any CPU должен быть совместим с проектом C++ в режиме x64, но это не так.

Для просмотра платформ отдельных проектов можно воспользоваться диалоговым окном Configuration Manager (вызывается соответствующей строкой в поле со списком). Доступные варианты платформ для проектов C#:

Any CPU
ARM
x64
x86

Варианты платформ для проектов C++:

ARM
Win32
x64

Платформа Win32 для C++ эквивалентна платформе x86 для C#. Работают только следующие комбинации платформ:

Выбрав в списке Solution Platforms вариант ARM, x64, x86 или Win32, вы получите одну из этих трех комбинаций.

В любой программе, приведенной в этом руководстве, попробуйте выбрать в списке Solution Platforms вариант ARM и нажать F5. Программа строится нормально, но не развертывается, потому что компьютер, на котором выполняется Visual Studio, не оснащен процессором ARM (я в этом уверен, потому что Visual Studio не работает на процессорах ARM).

Если у вас имеется машина на базе ARM с системой Windows 8 (как, например, в исходной версии планшетов Microsoft Surface), вероятно, вам стоит протестировать свои программы на ней. Однако установить Visual Studio на Surface нельзя, поэтому приложение придется перенести другим способом.

Для отладки и тестирования проще всего воспользоваться удаленным развертыванием, которое работает по сети WiFi. Когда все сделано, а на Surface работает удаленный отладчик, устройство не находится в спящем режиме и не отображает экран блокировки:

  1. Выберите платформу удаленной машины в поле Solution Platforms.

  2. Выберите вариант Remote Machine в раскрывающемся списке слева от поля Solution Configurations.

Эти действия желательно выполнять в указанном порядке, потому что целевая машина ассоциируется с платформой. Если сначала выбрать Remote Machine, а потом платформу, Visual Studio переключится обратно на вариант Local Machine.

Если решение состоит исключительно из кода C#, в поле Solution Platforms должен быть выбран вариант Any CPU независимо от того, где развертывается решение. Если решение содержит код C++, а развертывание осуществляется на машине на базе ARM (например, Microsoft Surface), выберите в поле Solution Platforms вариант ARM.

При распространении - при отправке приложения в Windows Store или при сборке программы для развертывания на других машинах — используется другой способ, основанный на создании в Visual Studio пакетов приложений командой Create App Packages меню Store.

В процессе создания пакетов открывается диалоговое окно Select and Configure Packages с таблицей архитектур. Если ваш проект содержит только код C#, выберите архитектуру Neutral, эквивалентную платформе Any CPU. Но если в проекте присутствует код C++, этот вариант недоступен; вы должны выбрать один или несколько из других вариантов: x64, x86 или ARM. Если развертывание должно осуществляться на машинах произвольного типа, вероятно, стоит выбрать все три варианта.

Если пакет предназначается не для отправки в Windows Store, а для установки на другом компьютере, Visual Studio создает каталоги для выбранных архитектур. Каждый из каталогов содержит сценарий Windows PowerShell (файл с расширением psl), который можно запустить для развертывания приложения. Один из популярных способов — скопировать каталог на USB-накопитель (или создать его там средствами Visual Studio), перенести накопитель на другую машину (например, Microsoft Surface) и запустить сценарий для установки приложения на этой машине.

Пройди тесты
Лучший чат для C# программистов