Windows 8 представляет WinRT, который похож на .NET, но неуправляемый. Почему это неуправляемо? Это проблема с производительностью? Означает ли это, что сборка мусора не подходит для API более низкого уровня?
c#
.net
windows-8
windows-runtime
user380719
источник
источник
Ответы:
WinRT является заменой для старого Winapi на основе Си. Это API, который должен использоваться во многих средах выполнения. Еще 20 лет назад с C api было относительно легко взаимодействовать. С того времени COM стал универсальным клеем во второй половине 1990-х годов. Практически любой язык, обычно используемый в Windows, поддерживает COM.
Сборщик мусора - это деталь реализации языка исполнения. Например, сборщик для .NET сильно отличается от сборщика для Javascript. Нативные объекты, созданные в любом из них, должны соблюдать очень строгие правила коллекционера. Это, в свою очередь, означает, что им пришлось бы создавать версии WinRT, специфичные для каждой языковой среды выполнения. Этого не произойдет, даже такая крупная компания, как Microsoft, не может позволить себе создавать и поддерживать определенную версию WinRT для каждой языковой привязки. В этом нет необходимости, учитывая, что эти языки уже поддерживают COM.
На данный момент лучшим связыванием для WinRT является C ++, поскольку COM работает более эффективно с явным управлением памятью. С большой помощью новых расширений компилятора C ++, которые делают его автоматическим, очень похожим на _com_ptr_t старого с C ++ / CLI-подобным синтаксисом, чтобы избежать этого. Привязка к управляемым языкам относительно проста, поскольку CLR уже имеет отличную поддержку взаимодействия COM. WinRT также принял формат метаданных .NET. Afaik, на сегодняшний день не было никакой работы над управляемыми компиляторами.
РЕДАКТИРОВАТЬ: Ларри Остерман, известный программист и блоггер Microsoft, оставил довольно хороший комментарий в уже удаленном ответе. Я приведу это здесь, чтобы сохранить его:
источник
IInspectable
позволяет вам делать такие вещи, как запрос объекта на предмет его фактического типа класса или списка всех поддерживаемых интерфейсов, а с помощью файлов winmd можно проецировать метаданные WinRT для всего этого в Reflection. ). И файлы winmd не могут быть сразу использованы как сборки взаимодействия, CLR должен обрабатывать их специально.WinRT неуправляем, потому что он предназначен для замены Win32 - API самого низкого уровня, доступного для разработчиков для Windows. Неуправляемый API по-прежнему является наиболее потенциально производительным, который может быть представлен разработчику, и есть основания полагать, что всегда будет возможно обернуть управляемый API поверх него, что в точности и делают «проекции».
Это также означает, что разработчики C ++ могут использовать WinRT, не перепрыгивая через обручи, которые вводит C ++ / CLI (см. Http://www2.research.att.com/~bs/bs_faq.html#CppCLI ). должен изучить COM, если вы хотите использовать WinRT.
На самом деле вопрос в том, зачем нужен COM? почему Microsoft должна была его изобрести? Потому что простой C ++ без всех дополнительных возможностей COM не подходит для реальной ООП-работы, а претензии Stroustrup на C ++, дающие вам «переносимость», очень неискренни в свете рабочей реальности. Смотрите http://webmechs.com/webpress/2011/11/c-versus-objective-c-as-api-substrate/
источник