Использование API WinRT из десктопных приложений Windows 8*

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:

Pour de plus amples informations sur les optimisations de compilation, consultez notre Avertissement concernant les optimisations.