Runtime system что это

Runtime и исполнительная модель — уточнение понятий

После эпического срача в теме про Redox задался вопросом, а правильно ли я понимаю что такое рантайм в самом общем случае?

Как я думаю, собственно среда выполнения программы — это набор библиотек,

который транслирует вызовы процедур из библиотек некоторого ЯВУ в вызовы API-функций конкретной ОС.

В этой связи у меня другой вопрос, что такое модель выполнения?

Почему Вики говорит, что среда выполнения реализует исполнительную модель в терминах отличных от тех,

в которых реализована сама библиотека ЯВУ.

The runtime system implements an execution model different from that of the language the library is written in terms of.

Там дальше, конечно, идет пояснение, но его сути я так и не уловил.

Runtime system что это. . Runtime system что это фото. Runtime system что это-. картинка Runtime system что это. картинкаstevejobs

Runtime system что это. 82971:1791648203. Runtime system что это фото. Runtime system что это-82971:1791648203. картинка Runtime system что это. картинка 82971:1791648203

Почему Вики говорит, что среда выполнения реализует исполнительную модель в терминах отличных от тех, в которых реализована сама библиотека ЯВУ.

А они ошибаются. Это не обязательно. Интерпретатор языка может быть написан и на самом этом языке.

это скомпилированный набор библиотек, который транслирует вызовы процедур из библиотек некоторого ЯВУ

Это, ИМХО, тоже не особо удачное определение. Исполнительная среда, это машина, включающая этот набор (попросту говоря, набор текстов программ). Правильнее рассматривать ее в контексте поведения. То есть, она имеет поведение такое, что транслирует вот такие-то строки в такие-то, как именно она реализована, второстепенно. Само слово «скомпилированный набор библиотек» вводит в заблуждение. Когда они скомпилированны, их уже, как бы, не существует, в том смысле, что исходники можно выбросить, а среда никуда не денется. Набор этот не имеет прямого отношения к рантайму

то есть, транслирует не скомпилированный набор библиотек, а некоторая машина, которая принимает на вход 2 строки: скомпилированный набор библиотек, и конечную программу.

Runtime system что это. 24345:1808597202. Runtime system что это фото. Runtime system что это-24345:1808597202. картинка Runtime system что это. картинка 24345:1808597202

В полном офигении подумал, что i_rinat забанили.

Runtime system что это. 24345:1808597202. Runtime system что это фото. Runtime system что это-24345:1808597202. картинка Runtime system что это. картинка 24345:1808597202

,Почему Вики говорит, что среда выполнения реализует исполнительную модель в терминах отличных от тех,

в которых реализована сама библиотека ЯВУ.

Парсер вошел в бесконечную рекурсию и сегфолтнулся.

Runtime system что это. 82971:1791648203. Runtime system что это фото. Runtime system что это-82971:1791648203. картинка Runtime system что это. картинка 82971:1791648203

Там есть оригинальный текст, может я кривой толмач)))

Runtime system что это. 70899:1358054296. Runtime system что это фото. Runtime system что это-70899:1358054296. картинка Runtime system что это. картинка 70899:1358054296

Ага, довыпендривался он.

Я не очень понимаю, почему я там в списке. В тонкостях терминологии я не разбираюсь и споры по тематике зачастую проигрываю.

Runtime system что это. 24345:1808597202. Runtime system что это фото. Runtime system что это-24345:1808597202. картинка Runtime system что это. картинка 24345:1808597202

Процитируй часть оригинального текста, которая вызвала вопрос.

Runtime system что это. 24345:1808597202. Runtime system что это фото. Runtime system что это-24345:1808597202. картинка Runtime system что это. картинка 24345:1808597202

Runtime system что это. 82971:1791648203. Runtime system что это фото. Runtime system что это-82971:1791648203. картинка Runtime system что это. картинка 82971:1791648203

The runtime system implements an execution model different from that of the language the library is written in terms of.

Runtime system что это. 82971:1791648203. Runtime system что это фото. Runtime system что это-82971:1791648203. картинка Runtime system что это. картинка 82971:1791648203

Как практикующий программист 🙂

Да тут скорее не для дискуссии, а для точного определения понятий, с претензией на универсальность.

Runtime system что это. 24345:1808597202. Runtime system что это фото. Runtime system что это-24345:1808597202. картинка Runtime system что это. картинка 24345:1808597202

Runtime system что это. 70899:1358054296. Runtime system что это фото. Runtime system что это-70899:1358054296. картинка Runtime system что это. картинка 70899:1358054296

В статье по ссылке справа есть блок, в котором runtime system и runtime library — отдельные пункты. В этом смысле у собранных программ на C и Rust runtime system нет. У Go и Objective-C есть: в частности, сборка мусора. У Java на JVM, понятное дело, есть JVM.

А чтобы всё не было так радужно, можно копнуть глубже, и обнаружить, что в glibc есть aio, который эмулируется на нитях. То есть некая неведомая штуковина запускает нити, хотя явно её никто не просил. Вполне себе runtime system.

Ох, там ещё и crt0. Вот тут я понимание потерял.

Runtime system что это. 24345:1808597202. Runtime system что это фото. Runtime system что это-24345:1808597202. картинка Runtime system что это. картинка 24345:1808597202

В статье по ссылке справа есть блок, в котором runtime system и runtime library — отдельные пункты

Runtime system что это. 82971:1791648203. Runtime system что это фото. Runtime system что это-82971:1791648203. картинка Runtime system что это. картинка 82971:1791648203

Просто по структуре самого предложения я посчитал,

Runtime system что это. 24345:1808597202. Runtime system что это фото. Runtime system что это-24345:1808597202. картинка Runtime system что это. картинка 24345:1808597202

Runtime system что это. 82971:1791648203. Runtime system что это фото. Runtime system что это-82971:1791648203. картинка Runtime system что это. картинка 82971:1791648203

Runtime system что это. 82971:1791648203. Runtime system что это фото. Runtime system что это-82971:1791648203. картинка Runtime system что это. картинка 82971:1791648203

Т.е. по-сути runtime-библиотека обеспечивает реализацию тех абстракций языка,

которые не реализованы в конкретной ОС?

Runtime system что это. 24345:1808597202. Runtime system что это фото. Runtime system что это-24345:1808597202. картинка Runtime system что это. картинка 24345:1808597202

Я бы сказал, что она реализует абстракции языка в терминах конкретной ОС. Правда, здесь корректнее говорить об execution environment, т.к. ОС может не быть или она может не участвовать в реализации конкретной абстракции.

Runtime system что это. 82971:1791648203. Runtime system что это фото. Runtime system что это-82971:1791648203. картинка Runtime system что это. картинка 82971:1791648203

Т.е. определение из ОП имеет право на жизнь?

Runtime system что это. 27819: 2006086286. Runtime system что это фото. Runtime system что это-27819: 2006086286. картинка Runtime system что это. картинка 27819: 2006086286

Я не очень понимаю, почему я там в списке

Извиняюсь =) Это я тебя порекомендовал 😉

Runtime system что это. 24345:1808597202. Runtime system что это фото. Runtime system что это-24345:1808597202. картинка Runtime system что это. картинка 24345:1808597202

Т.е. определение из ОП имеет право на жизнь?

Источник

System. Runtime Пространство имен

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Классы

Исключение, возникающее при наличии нескольких несовместимых методов интерфейса, переопределяющих другой метод.

Указывает параметры сборки мусора для текущего процесса.

Предоставляет сведения о JIT – компиляторе. Этот класс не наследуется.

Проверяет наличие достаточного количество ресурсов памяти перед выполнением операции. Этот класс не наследуется.

Улучшает производительность при запуске доменов приложения в приложениях, требующих JIT-компилятора путем фоновой компиляции методов, выполнение которых ожидается, на основе профилей, созданных во время предыдущих компиляций.

Структуры

Представляет зависимый обработчик сборки мусора. Этот обработчик условно сохранит зависимый экземпляр объекта в активном состоянии, пока экземпляр целевого объекта также находится в активном состоянии, без представления строгой ссылки на целевой экземпляр.

Перечисления

Указывает, будет ли Куча больших объектов (LOH) сжата во время следующей блокирующей сборки мусора.

Настраивает время вмешательства сборщика мусора в работу приложения.

Комментарии

Типы, найденные в этом пространстве имен, предназначены для использования в расширенной разработке.

Источник

System. Runtime. Interop Services Пространство имен

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Предоставляет разнообразные члены, поддерживающие COM-взаимодействие и службы вызова платформы. Если вы не знакомы с этими службами, см. раздел Взаимодействие с неуправляемым кодом.

Классы

Позволяет неуправляемому методу вызвать управляемый метод.

Указывает, будет ли выполняться маршалинг типа с использованием маршалера автоматизации или настраиваемого прокси-сервера и заглушки.

Определяет необходимость преобразования символов Юникода в наиболее подходящие символы ANSI.

Маршалирует данные типа VT_BSTR из управляемого кода в неуправляемый. Этот класс не наследуется.

Указывает, какой тип интерфейса класса должен генерироваться для класса, предоставленного модели COM, если интерфейс создан.

Указывает идентификатор компонентного класса, импортированного из библиотеки типов.

Небезопасный класс, предоставляющий набор методов для доступа к базовым представлениям данных коллекций.

Указывает псевдоним COM для типа параметра или поля.

Разрешает регистрацию позднего связывания для обработчика событий.

Показывает клиенту COM, что все классы текущей версии сборки совместимы с классами в более ранней версии сборки.

Показывает, что информация о классе или интерфейсе была потеряна при импортировании из библиотеки типов в сборку.

Определяет интерфейс по умолчанию, предоставляемый COM. Этот класс не наследуется.

Определяет исходный интерфейс и класс, реализующий методы интерфейса событий, созданного при импорте компонентного класса из библиотеки типов COM.

Исключение, которое выдается при возвращении неизвестного значения HRESULT после вызова метода COM.

Указывает, что тип с атрибутом был ранее определен в модели COM.

Задает метод, вызываемый при регистрации сборки для использования из COM. Это позволяет выполнять код, написанный пользователем, в процессе регистрации.

Определяет список интерфейсов, предоставляемых в виде источников событий COM для класса с атрибутом.

Определяет метод, вызываемый при удалении регистрации сборки, используемой из COM. Это позволяет в процессе удаления регистрации выполнять код, написанный пользователем.

Управляет доступностью отдельного управляемого типа или члена либо всех типов в сборки для модели COM.

Класс для управления оболочками типов IUnknown COM.

Представляет класс-оболочку для ресурсов обработчика.

Определяет значение перечисления CharSet. Этот класс не наследуется.

Указывает пути, используемые для поиска DLL, предоставляющих вызываемые для платформы функции.

Устанавливает значение параметра по умолчанию, которое используется, если параметр вызывается из языка, поддерживающего параметры по умолчанию. Этот класс не наследуется.

Указывает идентификатор диспетчера COM (DISPID) для метода, поля или свойства.

Указывает, что метод с атрибутом передается библиотекой динамической компонентов (DLL) как статическая точка входа.

Включает настройку управляемых объектов, полученных из неуправляемых объектов в процессе создания.

Базовый тип исключений для всех исключений COM-взаимодействия и исключений структурированной обработки исключений (SEH).

Указывает физическое расположение полей в неуправляемом представлении класса или структуры.

Предоставляет явный идентификатор Guid в случае, когда использование автоматического идентификатора GUID нежелательно.

Отслеживает незавершенные обработчики и инициирует сбор мусора при достижении заданного порогового значения.

Указывает, какая реализация IDispatch используется средой CLR при предоставлении COM сдвоенных и диспетчерских интерфейсов.

Показывает, что определенные в сборке типы были исходно определены в библиотеке типов.

Указывает, что данные необходимо маршалировать из вызывающего в вызываемый объект и не возвращать вызывающему объекту.

Исключение, вызванное использованием недопустимого COM-объекта.

Исключение, которое выдается упаковщиком при обнаружении аргумента типа variant, маршалинг которого в управляемый код выполнить невозможно.

Указывает, что неуправляемая подпись метода предполагает наличие параметра идентификатора языкового стандарта LCID.

Обеспечивает поддержку пользовательской настройки заглушек взаимодействия в сценариях с управляемым COM-взаимодействием.

Предоставляет коллекцию методов для выделения неуправляемой памяти, копирования блоков неуправляемой памяти и преобразования управляемых типов в неуправляемые, а также прочих разнообразных методов, используемых при взаимодействии с неуправляемым кодом.

Указывает способ маршалинга данных между управляемым и неуправляемым кодом.

Исключение, которое создается модулем упаковки и передачи, когда он встречает неподдерживаемый атрибут MarshalAsAttribute.

Предоставляет интерфейсы API для управления собственными библиотеками.

Этот класс содержит методы, которые в основном используются для управления собственной памятью.

Указывает, что параметр является необязательным.

Указывает, что данные необходимо маршалировать из вызываемого объекта обратно в вызывающий объект.

Предоставляет данные для PosixSignalRegistration события.

Указывает, что преобразование сигнатуры HRESULT, происходящее во время вызовов COM-взаимодействия, должно подавляться.

Показывает, что сборка с данным атрибутом является основной сборкой взаимодействия.

Позволяет пользователю задавать идентификатор ProgID класса.

Предоставляет набор служб для регистрации и удаления регистрации управляемых сборок при использовании из COM.

Предоставляет коллекцию статических ( static ) методов, возвращающих сведения о среде CLR.

Это исключение возникает, если ранг входного массива SAFEARRAY не совпадает с рангом, указанным в управляемой подписи.

Исключение создается, если тип входящего SAFEARRAY не совпадает с типом, указанным в управляемой подписи.

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

Представляет класс-оболочку для дескрипторов операционной системы. Этот класс должен наследоваться.

Представляет ошибки структурной обработки исключений (SEH).

Этот атрибут является устаревшим.

Заменяет стандартный независимый от потока модуль упаковки и передачи среды CLR на стандартный модуль упаковки и передачи STA OLE.

Позволяет управлять физическим размещением полей данных класса или структуры в памяти.

Указывает, что переход от сборки мусора должен быть пропущен при вызове неуправляемой функции.

Обеспечивает поддержку эквивалентности типов.

Предоставляет набор служб, преобразующих управляемую сборку в библиотеку COM-типов и наоборот.

Содержит флаги FUNCFLAGS, ранее импортированные для данного метода из библиотеки COM- типов.

Определяет, какой тип Type использует интерфейс исключительным образом. Этот класс не наследуется.

Содержит флаги TYPEFLAGS, ранее импортированные для данного типа из библиотеки COM-типов.

Содержит флаги VARFLAGS, ранее импортированные для данного поля из библиотеки COM-типов.

Задает номер версии экспортированной библиотеки типов.

Любой метод, помеченный UnmanagedCallersOnlyAttribute, можно вызывать напрямую из машинного кода. Затем можно загрузить токен функции в локальную переменную с помощью оператора address-of в C# и передать ее в качестве обратного вызова в собственный метод.

Управляет поведением при маршалинге сигнатуры делегата, передаваемой как указатель неуправляемой функции в неуправляемый код или из него. Этот класс не наследуется.

Маршалирует данные типа VT_VARIANT | VT_BYREF из управляемого кода в неуправляемый. Этот класс не наследуется.

Структуры

Инкапсулирует массив и смещение в указанный массив.

Взамен рекомендуется использовать BIND_OPTS.

Взамен рекомендуется использовать BINDPTR.

Двоичный интерфейс приложения для отправки функции COM-интерфейса.

Тип интерфейса и указатель на целевую VTable.

Взамен рекомендуется использовать CONNECTDATA.

Взамен рекомендуется использовать DISPPARAMS.

Взамен рекомендуется использовать ELEMDESC.

Взамен рекомендуется использовать ELEMDESC.DESCUNION.

Взамен рекомендуется использовать EXCEPINFO.

Взамен рекомендуется использовать FILETIME.

Взамен рекомендуется использовать FUNCDESC.

Предоставляет способ доступа к управляемому объекту из неуправляемой памяти.

Инкапсулирует управляемый объект, который содержит дескриптор для ресурса (передается в неуправляемый код с помощью вызова платформы).

Взамен рекомендуется использовать IDLDESC.

NFloat неизменяемый тип значения, представляющий плавающий тип, имеющий тот же размер, что и собственный целочисленный размер. Он предназначен для использования в качестве типа обмена на управляемой и неуправляемой границе, чтобы точно представить в управляемом коде неуправляемые интерфейсы API, использующие псевдоним типа для C или C++ с плавающей запятой на 32-разрядных платформах или Double на 64-разрядных платформах, например тип кгфлоат в библиотеках, предоставляемых Apple.

Представляет платформу операционной системы.

Взамен рекомендуется использовать PARAMDESC.

Взамен рекомендуется использовать STATSTG.

Взамен рекомендуется использовать TYPEATTR.

Взамен рекомендуется использовать TYPEDESC.

Взамен рекомендуется использовать TYPELIBATTR.

Взамен рекомендуется использовать VARDESC.

Взамен рекомендуется использовать VARDESC.DESCUNION.

Интерфейсы

Предоставляет неуправляемому коду доступ к классу Activator.

Предоставляет неуправляемому коду доступ к открытым членам класса Assembly.

Предоставляет неуправляемому коду доступ к классу AssemblyBuilder.

Предоставляет неуправляемому коду доступ к классу AssemblyName.

Предоставляет неуправляемому коду доступ к классу Attribute.

Предоставляет неуправляемому коду доступ к классу ConstructorBuilder.

Предоставляет неуправляемому коду доступ к открытым членам класса ConstructorInfo.

Предоставляет неуправляемому коду доступ к классу CustomAttributeBuilder.

Предоставляет неуправляемому коду доступ к классу EnumBuilder.

Предоставляет неуправляемому коду доступ к классу EventBuilder.

Предоставляет неуправляемому коду доступ к открытым членам класса EventInfo.

Предоставляет неуправляемому коду доступ к открытым членам класса Exception.

Предоставляет неуправляемому коду доступ к классу FieldBuilder.

Предоставляет неуправляемому коду доступ к открытым членам класса FieldInfo.

Предоставляет неуправляемому коду доступ к классу ILGenerator.

Предоставляет неуправляемому коду доступ к классу LocalBuilder.

Предоставляет неуправляемому коду доступ к открытым членам класса MemberInfo.

Предоставляет неуправляемому коду доступ к открытым членам класса MethodBase.

Предоставляет неуправляемому коду доступ к классу MethodBuilder.

Предоставляет неуправляемому коду доступ к открытым членам класса MethodInfo.

Предоставляет неуправляемому коду доступ к классу MethodRental.

Предоставляет неуправляемому коду доступ к классу Module.

Предоставляет неуправляемому коду доступ к классу ModuleBuilder.

Предоставляет неуправляемому коду доступ к классу ParameterBuilder.

Предоставляет неуправляемому коду доступ к классу ParameterInfo.

Предоставляет неуправляемому коду доступ к классу PropertyBuilder.

Предоставляет неуправляемому коду доступ к открытым членам класса PropertyInfo.

Предоставляет неуправляемому коду доступ к классу SignatureHelper.

Предоставляет неуправляемому коду доступ к классу Thread.

Предоставляет неуправляемому коду доступ к открытым элементам класса Type.

Предоставляет неуправляемому коду доступ к классу TypeBuilder.

Позволяет клиентам получать доступ к фактическому объекту, а не к объекту адаптера, предоставленному пользовательским упаковщиком.

Позволяет пользователям создавать код активизации для управляемых объектов, расширяющих MarshalByRefObject,.

Предоставляет настраиваемые оболочки, обрабатывающие вызовы методов.

Позволяет разработчикам предоставлять собственную управляемую реализацию метода IUnknown::QueryInterface(REFIID riid, void **ppvObject).

Интерфейс, используемый для участия в сбое приведения типа.

Предоставляет набор служб для регистрации и удаления регистрации управляемых сборок при использовании из COM.

Предоставляет набор служб, преобразующих управляемую сборку в библиотеку COM-типов и наоборот.

Предоставляет управление регистром имен при экспортировании в библиотеку типов.

Предоставляет механизм обратного вызова для преобразователя сборок, сообщающий вызывающему объекту состояние преобразования и вовлекающий вызывающий объект в процесс преобразования.

Предоставляет механизм обратного вызова для преобразователя библиотеки типов, сообщающий вызывающему объекту состояние преобразования и вовлекающий вызывающий объект в процесс преобразования.

Взамен рекомендуется использовать BIND_OPTS.

Взамен рекомендуется использовать IConnectionPoint.

Взамен рекомендуется использовать IConnectionPointContainer.

Взамен рекомендуется использовать IEnumConnectionPoints.

Взамен рекомендуется использовать IEnumConnections.

Взамен рекомендуется использовать IEnumMoniker.

Взамен рекомендуется использовать IEnumString.

Взамен рекомендуется использовать IEnumVARIANT.

Взамен рекомендуется использовать IMoniker.

Взамен рекомендуется использовать IPersistFile.

Взамен рекомендуется использовать IRunningObjectTable.

Взамен рекомендуется использовать IStream.

Взамен рекомендуется использовать ITypeComp.

Взамен рекомендуется использовать ITypeInfo.

Взамен рекомендуется использовать ITypeLib.

Перечисления

Указывает архитектуру процессора.

Определяет набор флагов, используемый при регистрации сборок.

Взамен рекомендуется использовать CALLCONV.

Задает соглашение о вызовах, которое требуется для вызова методов, реализованных в неуправляемом коде.

Определяет, какой набор символов должны использовать упакованные строки.

Указывает, какой тип интерфейса генерируется для класса.

Определяет способ предоставления интерфейса модели COM.

Описывает тип члена модели COM.

Предоставляет значения, возвращаемые методом GetInterface(Guid, IntPtr).

Взамен рекомендуется использовать DESCKIND.

Указывает пути, используемые для поиска DLL, предоставляющих вызываемые для платформы функции.

Описывает обратные вызовы, которые делает программа экспорта библиотек типов при экспорте библиотеки типов.

Взамен рекомендуется использовать FUNCFLAGS.

Взамен рекомендуется использовать FUNCKIND.

Предоставляет типы дескрипторов, которые могут быть выделены классом GCHandle.

Указывает, какую реализацию IDispatch следует использовать для определенного класса.

Взамен рекомендуется использовать IDLFLAG.

Взамен рекомендуется использовать IMPLTYPEFLAGS.

Описывает обратные вызовы, выполняемые импортером библиотеки типов при импортировании библиотеки типов.

Взамен рекомендуется использовать INVOKEKIND.

Управляет макетом объекта при его экспорте в неуправляемый код.

Взамен рекомендуется использовать LIBFLAGS.

Взамен рекомендуется использовать PARAMFLAG.

Указывает номер сигнала POSIX.

Определяет набор контекстов выполнения, в которых объект класса будет доступен для запросов, создающих экземпляры.

Определяет тип подключения к объекту класса.

Взамен рекомендуется использовать SYSKIND.

Взамен рекомендуется использовать TYPEFLAGS.

Взамен рекомендуется использовать TYPEKIND.

Показывает способ создания библиотеки типов.

Описывает исходные параметры FUNCFLAGS в библиотеке типов COM, из которой был импортирован данный метод.

Показывает способ создания сборки.

Описывает исходные параметры флагов TYPEFLAGS в библиотеке типов COM, из которой был импортирован данный тип.

Описывает исходные параметры VARFLAGS в библиотеке COM-типов, из которой была импортирована эта переменная.

Определяет порядок маршалинга параметров или полей в неуправляемый код.

Показывает способ маршалинга элементов массива при маршалинге массива из управляемого кода в неуправляемый код как массива SafeArray.

Взамен рекомендуется использовать VARFLAGS.

Делегаты

Предоставляет делегат, используемый для разрешения собственных библиотек посредством обратного вызова.

Комментарии

Источник

Windows Runtime. Система типов и взаимодействие с CLR

С выходом Windows 8 разработчикам стала доступна новая библиотека классов — Windows Runtime. Компоненты WinRT могут использоваться в приложениях Windows Store и настольных приложениях; в неуправляемом коде C/C++, в JavaScript, а также в C# и Visual Basic.

Метаданные Windows Runtime

Runtime system что это. image loader. Runtime system что это фото. Runtime system что это-image loader. картинка Runtime system что это. картинка image loader

Тем не менее, метаданные, которые описывают этот тип позволяют CLR получить экземпляр реализации при вызове конструктора класса.
При просмотре Windows Runtime метаданных можно также заметить, что определения типов и сборок используют новое ключевое слово WindowsRuntime.

Runtime system что это. image loader. Runtime system что это фото. Runtime system что это-image loader. картинка Runtime system что это. картинка image loader

Это ключевое слово является контекстно-зависимым и по разному интерпретируется в зависимости от того, где оно применяется. Например, если ключевым словом помечено определение типа (TypeDef), то этот тип подчиняется правилам системы типов Windows Runtime и вызов этого типа следует рассматривать как вызов WinRT API.

Взаимодействие CLR с компонентами WinRT

CRL поддерживает взаимодействие с COM-компонентами через обертки Runtime Callable Wrapper (RCW) и COM Callable Wrapper (CCW). Таким образом в CLR ссылка на WinRT объект представляет собой ссылку на RCW, которая в свою очередь содержит ссылку на WinRT объект. Соответственно управляемый код взаимодействует с RCW, который по сути является интерфейсом между вашим кодом и WinRT объектом.

Runtime system что это. image loader. Runtime system что это фото. Runtime system что это-image loader. картинка Runtime system что это. картинка image loader

Аналогичным образом в Windows Runtime ссылка на объект CLR представляет собой ссылку на CCW, которая в свою очередь содержит ссылку на CLR объект. Windows Runtime при этом взаимодействует с CCW для доступа к функциональности управляемого объекта.

WinRT типы и управляемый код

Runtime system что это. image loader. Runtime system что это фото. Runtime system что это-image loader. картинка Runtime system что это. картинка image loader

Проецирование типов
Базовый тип
Структуры

Структуры WinRT, в отличие от значимых типов CLR, могут содержать только открытые поля одного из базовых типов или же являться другой структурой WinRT. Таким образом, следующий код выдаст ошибку на этапе компиляции:

К тому же, структуры WinRT не могут определять конструкторы или содержать вспомогательные методы. Однако, некоторые структуры CLR, для удобства, проецирует на свои собственные, тем самым предоставляя разработчикам вспомогательные методы и конструкторы. К таким относятся, например, структура Windows.Foundation.Point, Windows.Foundation.Size и Windows.Foundation.Rect.

Строки
Null-совместимые типы

то в управляемом коде этот метод будет выглядеть следующим образом:

Делегаты

В качестве типа параметра или возвращаемого значения делегата WinRT могут использовать только WinRT-совместимые типы. Так же делегаты с глобальной (public) областью видимости не могут быть объявлены как вложенные (на самом деле это общие правила для среды выполнения Windows в целом). Когда вы передаете объект делегата компоненту Windows Runtime, этот объект упаковывается в обертку CCW, которая не уничтожается сборщиком мусора до тех пор, пока она не будет освобождена компонентом, который ее использует. Интересен так же тот факт, что делегаты WinRT не имеют методов BeginInvoke и EndInvoke.

События

то при компиляции этой строки кода, компилятор превращает ее в следующие инструкции:

Для того, чтобы вызывать событие, следует воспользоваться свойством InvocationList, возвращающее делегат, список вызовов которого включает в себя все делегаты, добавленные в качестве обработчиков события.

Время и дата

В WinRT время и дата представляются в формате UTC структурой Windows.Foundation.DateTime. CLR проецирует данный тип на структуру System.DateTimeOffset, а не на System.DateTime. Стоит заметить, что DateTime не содержит информацию о часовом поясе. Поэтому дата и время, возвращаемые функциями WinRT в формате UTC, CLR преобразует в локальное время. И наоборот, при передаче структуры DateTimeOffset в WinRT функцию, дата и время преобразуются в UTC формат.

Массивы

WinRT API поддерживает только одномерные массивы. Соответственно следующий код вызовет ошибку времени компиляции:

В управляемом коде массивы передаются по ссылке, при этом изменения элементов массива будут видны любому коду, который имеет ссылку на экземпляр этого массива. Однако, для WinRT это не всегда так, потому что содержимое массива маршалируется только в направлении, которое API определяет в своей сигнатуре, используя System.Runtime.InteropServices.InAttribute и System.Runtime.InteropServices.OutAttribute. Оба атрибута применяются к параметрам метода или возвращаемым значениям и определяют направление маршалинга между управляемой и неуправляемой памятью во время выполнения. В Windows Runtime параметры могут быть либо только для чтения [InAttribute], либо только для записи [OutAttribute] и не могут быть отмечены для чтения и записи одновременно [InAttribute], [OutAttribute]. Это означает, что содержимое массива, передаваемого методу, а также сам массив должны быть предназначены для чтения или для записи. Так, содержимое массива, который помечен атрибутом [InAttribute], копируется в вызываемый метод, поэтому все изменения, которые метод применяет к массиву, не видны вызывающему объекту. Аналогично, содержимое массива, который помечен атрибутом [OutAttribute], устанавливается вызываемым методом и копируется в вызывающий объект, поэтому вызываемый метод не должен делать каких-либо предположений о содержимом исходного массива.

Коллекции

При передачи коллекции CLR упаковывает объект коллекции в обертку CCW и передает ссылку на нее в WinRT API. При этом вызовы через обертку пересекают границу взаимодействия, что отрицательно сказывается на производительности. Однако, в отличие от массивов, возможно выполнение операций без копирования элементов.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *