API выполняемого модуля Windows* WinRT является новым основным API приложений для Windows 8 Store*. Этот API раскрывает разработчикам все новые возможности Windows 8* с использованием высокоэффективного объектно-ориентированного принципа.
Этот API написан на C++ на основе Win32 и интерфейса COM. Доступ для других языков (в частности, C++/CX, C#, Visual Basic * и Javascript *) предоставляется посредством файлов метаданных API (с расширением *.winmd).
Может сложиться мнение, что API WinRT доступен только для приложений для магазина Windows 8*, но и классические приложения также имеют к нему доступ. Более того, некоторые компоненты API, например PackageManager, доступны только для классических приложений, поскольку их необходимо выполнять вне песочницы приложений для магазина Windows 8*. Получить сведения о доступности компонентов API можно непосредственно в библиотеке MSDN. В верхней части большинства классов указываются сведения о совместимости.
Для классических приложений остаются недоступными функции, предназначенные главным образом для приложений магазина Windows 8*: элементы дизайна и контакты.
WinRT предоставляет доступ к своему содержимому для других языков посредством двух основных WINMD-файлов:
- Windows.winmd: C:\Program Files (x86)\Windows Kits\8.0\References\CommonConfiguration\Neutral
- Platform.winmd: C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0\ExtensionSDKs\Microsoft.VCLibs\11.0\References\CommonConfiguration\neutral
Они соответствуют пространствам имен Windows и Platform. Пространство имен Windows предоставляет доступ к большинству функций среды выполнения Windows, а пространство имен Platform содержит важные типы, например String.
Вот некоторые полезные компоненты среды выполнения Windows, которые можно использовать из десктопных приложений:
- Windows.Sensors (акселерометр, гирометр, датчик освещенности, датчик ориентации и пр.)
- Windows.Networking.Proximity.ProximityDevice (NFC)
- Windows.Device.Geolocation (GPS)
- Windows.UI.Notifications.ToastNotification
- Windows.Globalization
- Windows.Security.Authentication.OnlineId (в том числе интеграция LiveID)
- Windows.Security.CryptographicBuffer (полезные функции кодирования и декодирования двоичных данных)
- Windows.ApplicationModel.DataTransfer.Clipboard (доступ к буферу обмена Windows 8 * и наблюдение за ним)
В этой статье вы узнаете, как использовать WinRT из десктопных проектов C#, а также из проектов C++/CXи на стандартном языке C++.
Использование среды выполнения Windows из проекта C#/.NET
По умолчанию среда разработки Visual Studio * 2012 не предоставляет доступ к среде выполнения Windows из обычных проектов десктопных приложений C#.
Прежде всего, необходимо объявить, что проект предназначен для Windows 8.
К сожалению, в VS2012 для этого не предусмотрен графический пользовательский интерфейс, поэтому сначала придется выгрузить проект C#:
Затем можно вручную отредактировать CSPROJ-файл, добавив в него следующее:
<PropertyGroup> <TargetPlatformVersion>8.0</TargetPlatformVersion> </PropertyGroup>
Перезагрузите проект:
Теперь проект предназначен для Windows 8*. Из проекта можно ссылаться на WINMD-файлы:
В диспетчере ссылок должна появиться новая вкладка Windows:
Щелкните Windows, чтобы добавить Windows.winmd в качестве ссылки в проект. Если этот элемент отсутствует, можно вручную указать ссылку на его расположение (C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0\ExtensionSDKs\Microsoft.VCLibs\11.0\References\CommonConfiguration\neutral) с помощью кнопки «Обзор».
Теперь можно использовать среду выполнения Windows из классического приложения с полной поддержкой Intellisense:
Также может потребоваться добавить ссылку на System.Runtime.WindowsRuntime.dll, если вы используете сопоставленные типы , такие как обработчики событий среды выполнения Windows
Эта сборка находится в папке C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5 .
Пример работы с акселерометром с помощью WinRT C#/.NET
using System; using Windows.Devices.Sensors; namespace CSApp { class Program { static void Main() { Accelerometer accelero = Accelerometer.GetDefault(); accelero.ReadingChanged += (Accelerometer sender, AccelerometerReadingChangedEventArgs args) => { Console.WriteLine(args.Reading.AccelerationX); }; Console.Read(); } } }
Использование среды выполнения Windows из проекта C++
Можно использовать API WinRT из C++/CX или из стандартного C++. При использовании стандартного C++ потребуется использовать WRL (библиотеку шаблонов C++ среды выполнения Windows) и напрямую обрабатывать объекты COM.
Оба решения создают собственный код, но использование WRL отличается намного более высокой трудоемкостью по сравнению с C++/CX.
Решение C++/CX
Решение C++/CX во многом близко к C++/CLI. Основное отличие от C++/CLI заключается в том, что C++/CX вообще не создает управляемый код; образуется только собственный код.
Общую документацию по C++/CX см. в библиотеке MSDN. Для начала можно использовать краткий справочник.
Чтобы включить использование CX в проекте C++, откройте свойства проекта.
В C/C++на вкладке «Общие» установите для параметра «Использовать расширение среды выполнения Windows» значение «Да (/ZW)»:
Затем задайте параметр /Gm-, поскольку параметр /Gm несовместим с /ZW:
Теперь ваш проект является проектом C++/CX.
Добавьте пути к файлам Windows.winmd и Platform.winmd в «Дополнительные каталоги #using»:
В исходном коде добавьте:
#using <Windows.winmd> #using <Platform.winmd>
Теперь можно использовать среду выполнения Windows из проекта C++ с полной поддержкой Intellisense:
Для инициализации объектов среды выполнения Windows программа должна инициализировать среду выполнения Windows.
Для этого проще всего добавить атрибут [Platform::MTAThread] (или[Platform::STAThread]) во входную точку программы. В противном случае можно вручную вызвать RoInitialize() и RoUninitialize().
Пример акселерометра C++/CX
#include <iostream> #using <Windows.winmd> using namespace Windows::Devices::Sensors; #using <Platform.winmd> using namespace Platform; [MTAThread] int main(void) { Accelerometer^ accelero = Accelerometer::GetDefault(); accelero->ReadingChanged += ref new Windows::Foundation::TypedEventHandler<Accelerometer^,AccelerometerReadingChangedEventArgs^>( [](Accelerometer^ sender, AccelerometerReadingChangedEventArgs^ args){ std::cout << args->Reading->AccelerationX << std::endl; }); std::cin.get(); return 0; }
Решение C++ WRL
При использовании WRL можно напрямую обрабатывать объекты COM, доступные через WinRT.
Дополнительные сведения см. в библиотеке MSDN: