[ANN] WinRT - новое компонентное API для Windows 8
От: Gollum Россия  
Дата: 15.09.11 13:54
Оценка: 196 (17)
Я тут попробовал описать свои впечатления от WinRT
Честно, даже не знаю куда отправить По логике вещей это надо в COM, или C++. Но что-то мне кажется, что это нужно в первую очередь в .NET, так как по идее, это то, что нас всех ждет в самом ближайшем будущем. Копирую сообщение сюда, чтобы в блог было необязательно ходить Сиплюсплюсник из меня аховый, конечно, если что — поправляйте.

После второго дня конференции сложилось впечатление, что ходить нужно только на сессии про С++. Все остальное лишь показывает, как использовать новые API WinRT, но при этом остается непонятно, как собственно этот WinRT устроен. Я напишу, как понял сам

Итак, WinRT — это COM следующей версии. В общем, это и неудивительно, учитывая что Steven Sinofsky делал и предыдущую версию. Плюс к этому, WinRT использует расширения C++, как стандарта 11, так и собственные. Некоторой частью эти расширения похожи на расширения managed C++, но не нужно их путать. WinRT не использует CLR, и несмотря на то, что синтаксис местами одинаковый (например, Search::QueryOptions^), в WinRT это означает совсем другое. Для начала, чтобы создать библиотеку WinRT, используется ключ компилятора /ZW (чтоб никто не догадался), в то время как для managed C++ нужно использовать ключ /clr.
Как же выглядит код на C++ для WinRT? Примерно так:

using namespace Windows::Storage;

Search::QueryOptions^ options = ref new Search::QueryOptions(Search::CommonFileQuery::DefaultQuery, nullptr);
options->FolderDepth = Search::FolderDepth::Deep;
auto query = KnownFolders::PicturesLibrary->CreateFileQueryWithOptions(options);


Первое, что тут бросается в глаза — это ref new. В документации написано, что таким образом мы получаем smart pointer, который автоматически уменьшает счетчик ссылок, когда объект выходит из области видимости. То есть, это тот же COM. Пока не ясно, предпринято ли что-нибудь для решения проблемы циклических ссылок, и что именно это за указатели (думаю, что std::shared_ptr). Сборщика мусора здесь, как такового, нет.

Ключевое слово auto как раз из нового стандарта С++ 11, это вывод типа, по смыслу аналогичный var в С#. Язык шагнул очень далеко вперед — появились такие вещи, как лямбды (с поддержкой замыканий, но их надо явно описывать) и туплы (видимо чтобы была хоть какая-то замена анонимным типам).

В WinRT есть хитрый маршаллинг, благодаря чему можно в C# итерироваться по вектору из C++ кода WinRT компоненты. Как я понимаю, это достигается тем, что на типы WinRT наложен ряд жестких ограничений. Подробно про это можно посмотреть здесь: http://msdn.microsoft.com/en-us/library/windows/apps/hh454062(v=VS.85).aspx. Если укладываться в рамки ограничений, то можно использовать любые нативные библиотеки для разработки своих компонентов WinRT, и это очень здорово.

Все типы WinRT наследуются от Platform::Object.Мне пока нигде не удалось найти, что этот тип содержит, но логика подсказывает, что он должен выполнять базовую поддержку <b>IInspectable</b> — нового фундаментального интерфейса, который отвечает за получение метаданных типа. На слайдах также было нарисовано, что все типы WinRT реализуют IUnknown (что, в общем-то, неудивительно). Метаданные WinRT типов лежат в некоторой системной директории Windows, и имеют расширение winmd. Эти метаданные можно открывать ildasm'ом, они имеют стандартный дотнетный формат.

На мой взгляд, это пока главное, что нужно понимать про WinRT. Конечно, там еще огромное количество всего — C++-ые свойства, делегаты, события. Специальная работа со строками — в WinRT для этого свой тип, и т.п., все это можно прочитать по ссылке выше (хотя информации пока немного, надеюсь будут обновлять оперативно). Но самое главное уже более-менее понятно. Перед нами новая версия COM.
Eugene Agafonov on the .NET

winrt
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.