Взаимодействие с неуправляемым кодом — .NET Framework
Twitter LinkedIn Facebook Адрес электронной почты
- Статья
Платформа .
Код, выполняющийся под управлением среды выполнения, называется управляемым кодом. И наоборот, код, выполняемый вне среды выполнения, называется неуправляемым кодом. Примерами неуправляемого кода являются компоненты COM, интерфейсы ActiveX и функции Windows API.
Предоставление COM-компонентов платформе .NET Framework
Описывает способы использования COM-компонентов в приложениях .NET Framework.
Предоставление компонентов .NET Framework клиентам COM
Использование неуправляемых функций DLL
Описывает способ вызова неуправляемых функций DLL с помощью вызова платформы.
Маршалинг взаимодействия
Описывает маршалинг для COM-взаимодействия и вызова неуправляемого кода.
Практическое руководство. Сопоставление значений HRESULT и исключений
Описывает сопоставление исключений и значений HRESULT.
Эквивалентность типов и внедренные типы взаимодействия
Описывается способ внедрения сведений о типах COM в сборках и определения общеязыковой средой выполнения эквивалентности встроенных типов COM.
Практическое руководство. Создание основной сборки взаимодействия с помощью программы Tlbimp.exe
Описывается способ создания основных сборок взаимодействия с помощью Tlbimp.exe (программа импорта библиотек типов).
Практическое руководство. Регистрация основных сборок взаимодействия
COM-взаимодействие без регистрации
Описывается способ активации COM-взаимодействием компонентов без использования реестра Windows.
Практическое руководство. Настройка COM-компонентов на основе платформы .NET Framework для активации без регистрации
Описывается способ создания манифеста приложения, а также создания и внедрения манифеста компонента.
Oболочки COM
Описываются программы-оболочки, предоставляемые COM-взаимодействием.
Работа с неуправляемым кодом
Министерство образования Республики Беларусь
Учреждение образования «Белорусский государственный университет информатики и радиоэлектроники»
Факультет непрерывного и дистанционного обучения
Кафедра программного обеспечения информационных технологий
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к контрольной работе № 1
по курсу «Операционные системы и системное программирование. Часть 3»
Студент: гр. 801021 Коноплёв А.П.
Руководитель: Прохорчик Р.В.
Минск 2011
Содержание
Работа с неуправляемым кодом………………………………………………….…3
1. Управляемый и неуправляемый код……………………………………………3
2. Службы Platform Invoke…………………………………………………………5
2.1. Службы COM Interoperability………………………………………………5
2.2. Обзор механизма преобразования………………………………………….6
2.3. Работа службы Platform Invoke. Запуск функций WinAPI……………….7
3. C++ .NET. Совмещение управляемого и неуправляемого кодов……………10
3.1. Управляемая библиотека…………………………………………………..13
3.2. Управляемая библиотека в управляемом коде……………………………14
3.3. Управляемая библиотека в неуправляемом коде…………………………15
3. 4. Вызов неуправляемых функций из управляемого модуля………………15
3.5. Идентификация вызываемой функции……………………………………16
3.6. Создание класса для размещения библиотечной функции………………17
3.7. Прототипы в управляемом коде……………………………………………17
4. Небезопасный код………………………………………………………………19
Список использованных источников……………………………………….……..23
Управляемый код (англ. managed code) — термин, введённый Microsoft для обозначения кода программы, исполняемой виртуальной машиной .NET под управлением CLR.
С формальной точки зрения управляемым кодом является любой программный код, исполняемый в среде отладчика.
Неуправляемый код (англ. unmanaged code) — обычный машинный код, программный код, выполняющийся вне среды выполнения CLR.
Слово управляемый здесь относится к методу обмена информацией между программой и исполняющей средой. Оно означает, что в любой точке исполнения управляющая среда может приостановить исполнение и получить информацию, специфичную для текущего состояния.
Необходимая для этого информация представлена в управляемом коде на языке Intermediate Language и в связанных с этим кодом метаданных.
CIL (англ. Common Intermediate Language) — промежуточный язык, разработанный фирмой Microsoft для платформы .NET Framework.
CLR (англ. Common Language Runtime) — общая среда выполнения языков .NET.
Результатом проекта, написанного на C# и скомпилированного в Visual Studio 2008, является сборка (assembly), которая содержит IL-код (Intermediate Language код) проекта и манифест, полностью описывающий сборку. Сборка может быть создана на одном компьютере, на одной платформе, а выполняться на другом компьютере с другим типом процессора, с другой операционной системой. Для выполнения сборки необходимо и достаточно установки на целевом компьютере соответствующей версии Framework .Net, представляющего надстройку над операционной системой.
Когда мы говорим о сборках, язык программирования, на котором создавался исходный код, уже не имеет значения, его особенности никак не отражаются в сборке. Сборки, созданные на VB или C++ с управляемыми расширениями, неотличимы от сборок, которые созданы на C# или других языках, включенных в состав Visual Studio 2008 и использующих каркас Framework .Net при компиляции управляемого кода.
С другой стороны, понятно, что в состав Visual Studio 2008 могут включаться языки, не применяющие Framework .Net, не создающие сборки с управляемым кодом, а использующие собственные библиотеки и собственные каркасы приложений (Framework Applications). В частности, на языке С++ в рамках Visual Studio 2008 можно писать проекты, работающие с библиотеками MFC и ATL, ориентированные исключительно на С++ и создающие в результате компиляции проекта обычные exe-файлы.
Сегодня на всех компьютерах, работающих под управлением любой из версий Windows, установлена соответствующая версия Framework .Net, так что на таких компьютерах могут выполняться и сборки, и обычные exe-файлы. Поскольку Framework .Net, так же как и C#, стандартизован и является свободно распространяемым программным продуктом, его можно встретить и на тех компьютерах, где нет Windows.
На рис. 1 показана схема функционирования компьютера, позволяющего выполнять как сборки — управляемый код, так и обычные exe-файлы — неуправляемый код.
Рис. 1. Управляемый и неуправляемый код
Следует заметить, что два типа программ, выполняемые по-разному, могут взаимодействовать друг с другом — из управляемого кода возможен вызов программ с неуправляемым кодом и наоборот. В проектах, написанных на C#, можно управлять офисными приложениями — документами Word и Excel. Офисные документы — это COM-объекты, принадлежащие миру неуправляемого кода, а проекты C# — это сборки, относящиеся к миру с управляемым кодом.
Примеры неуправляемого программного кода, вызываемого из управляемых C# приложений:
Microsoft .NET Framework позволяет взаимодействовать с COM-компонентами, COM+-службами, внешними типами библиотек и разными службами операционной системы. Перехват исключений различается в управляемом и неуправляемом коде. Платформа .NET Framework предлагает две службы взаимодействия управляемого кода с неуправляемым — Platform Invoke и COM interoperability, которые используют реальные возможности проекта.
Управляемый и неуправляемый код— основные отличия
Это продолжение нашего предыдущего блога о небезопасном коде. В этом блоге мы поймем ключевые различия между управляемым и неуправляемым кодом на C#. Неуправляемый код — это не что иное, как небезопасный код.
Если вы помните, в C# код обычно выполняется под управлением Common Language Runtime (CLR) платформ .NET. CLR помогает выполнять код, а также предоставляет множество сервисов, облегчающих процесс разработки. Все коды, которые контролируются средой CLR, называются управляемым кодом, а части программы, написанные с использованием ключевого слова unsafe, называются неуправляемым кодом. Они находятся вне контроля CLR фреймворков .NET.
Содержание
- Что такое управляемый код в C#?
- Выполнение управляемого кода
- Преимущества управляемого кода
- Недостатки управляемого кода
- Что такое неуправляемый код в C#?
- Выполнение неуправляемого кода
- Преимущества неуправляемого кода
- Недостатки неуправляемого кода
- Разница между управляемым и неуправляемым кодом
- Заключение
Как мы видели в начале, код, который разрабатывается с использованием Common Language Runtime (CLR) платформы .NET, называется управляемым кодом. Другими словами, это код, который выполняется непосредственно на C#. Среда выполнения для управляемого кода предоставляет программисту множество услуг. Предоставляемые услуги: обработка исключений, сборка мусора, проверка типов и т. д. Вышеупомянутые услуги предоставляются программисту автоматически. Помимо вышеперечисленных сервисов среда выполнения также обеспечивает выделение памяти, удаление объектов, создание объектов и т. д.
Выполнение управляемого кодаУправляемый код всегда компилируется средой CLR в промежуточный язык, известный как MSIL, после чего создается исполняемый файл кода. Промежуточный язык (MSIL) в исходном коде компилируется компилятором Just In Time Compiler, когда исполняемый файл запускается программистом. Здесь весь процесс выполняется в среде выполнения, поэтому среда выполнения является причиной работы программы.
Преимущества управляемого кода- Повышена безопасность кода, поскольку мы используем среду выполнения, которая защищает от переполнения буфера путем проверки буферов памяти.
- Сборка мусора выполняется автоматически.
- Также предусмотрена динамическая проверка типов или проверка типов во время выполнения
- Среда выполнения также выполняет проверку ссылок. Он проверяет, является ли контрольная точка объекта допустимой или нет, а также проверяет, присутствует ли дублирующийся объект или нет.
- Память не может быть выделена напрямую.
- В управляемом коде нельзя получить низкоуровневый доступ к архитектуре ЦП.
Неуправляемый код также известен как небезопасный код. Неуправляемый код зависит от архитектуры компьютера, поскольку он нацелен на архитектуру процессора. В C# такие действия, как управление стеками, выделение и освобождение памяти и т. д., выполняются средой CLR, и, следовательно, эти действия не входят в компетенцию программиста. Программист сообщает компилятору, что управление кодом будет осуществляться им/ею, когда он/она использует ключевое слово «небезопасно». Однако такие проблемы, как утечка памяти, могут возникнуть, если программист пишет плохой код.
Выполнение неуправляемого кодаДля выполнения неуправляемого кода в C# используются классы-оболочки. В C# неуправляемый код выполняется непосредственно операционной системой. Как правило, исполняемые файлы неуправляемого или небезопасного кода представляют собой двоичные образы, которые загружаются в память. Этапы выполнения кода можно увидеть на изображении выше.
Преимущества неуправляемого кода- Небезопасный код повышает стабильность и производительность программы
- Предоставляется низкоуровневый доступ к программатору
- Небезопасный код предоставляет среду для взаимодействия с памятью
- Безопасность приложения не обеспечивается
- Программист должен выполнить обработку исключений
- Нет автоматической реализации сборки мусора
- Использование небезопасного кода может привести к ошибкам, которые могут возникнуть при обходе проверки типов.
- Управляемый код — это код, который выполняется средой CLR .NET Framework, в то время как неуправляемый или небезопасный код выполняется операционной системой.
- Управляемый код обеспечивает безопасность кода, в то время как неповрежденный код создает угрозы безопасности.
- В небезопасном или неуправляемом коде модификатор unsafe используется для записи блока кода, в то время как любой другой код, написанный за пределами небезопасного блока кода, является управляемым кодом.
- Проблемы переполнения буфера памяти не возникают в управляемом коде, так как об этом заботится среда выполнения, но эти проблемы возникают в неуправляемом коде.
- Службы среды выполнения предоставляются в управляемом коде, но не предоставляются в неуправляемом коде.
- Исходный код сначала преобразуется в промежуточный язык, а затем в собственный язык в управляемом коде, а в неуправляемом коде напрямую преобразуется в родной язык.
- Неуправляемый код обеспечивает низкоуровневый доступ, а управляемый код — нет.
- В небезопасном или неуправляемом коде модификатор unsafe используется для записи блока кода, в то время как любой другой код, написанный за пределами небезопасного блока кода, является управляемым кодом.
Эта статья дает представление об управляемом и неуправляемом коде на C#. Поток выполнения каждого типа кода был продемонстрирован в статье, которая поможет вам понять правильное использование этих кодов при разработке любого типа приложения.
Использование C++/CLI с неуправляемым кодом — Boost,
Я пытаюсь скомпилировать библиотеку C++ для использования с C# в Windows (библиотека Vanetza).
Библиотека использует CMake, я собираю из Microsoft Visual Studio Community 2022 (64-бит). Я могу собрать библиотеку как общую DLL без проблем. Для использования с C# я подумал о том, чтобы скомпилировать библиотеку как C++/CLI (включена поддержка общеязыковой среды выполнения). Сначала я не мог скомпилировать его, потому что проект использует Boost, но некоторые проблемы компиляции были решены путем окружения каждого включения Boost #управляемая pragma(push, off)
и #управляемая pragma(pop)
.
Проблема, которая блокирует меня сейчас, заключается в том, что заголовок
нельзя использовать с C++/CLI. Я получаю эту ошибку компиляции из множества разных мест:
Код серьезности Описание Состояние подавления строки файла проекта Ошибка C1189 #error:не поддерживается при компиляции с /clr или /clr:pure. geonet C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\включить\будущее 13
и я не могу это решить. Я думаю, что какой-то используемый модуль Boost нуждается в этом заголовке. Есть ли какое-либо решение для этого или есть другой подход, который можно было бы использовать? Мне нужно не только добраться до некоторых C++ функций библиотеки, но и использовать некоторые ее классы и увидеть некоторые ее структуры.
Я попытался скомпилировать библиотеку как обычный C++, а затем сделать интерфейсную библиотеку C++/CLI, которая будет вызываться из C#, но заголовок снова где-то используется. Я думаю, что использование P/Invoke (DLLImport) для меня нецелесообразно, так как это позволяет использовать только функции C/C++, но для классов и структур его нельзя использовать (насколько я понимаю).
Возможно ли только переписать те части, которые нуждаются <будущее>
самостоятельно, используя конструкции C#, упомянутые в этом вопросе?
Что касается других подобных вопросов, кажется, что иногда проект можно построить так, что Boost работает без проблем, а иногда требуется серьезная переработка кода. Может ли кто-нибудь порекомендовать мне, какой подход можно было бы использовать в моем случае? Я мог бы использовать более старую версию Boost (а именно 1.58.0), но не знаю, поможет ли это.
- С++
- повышение
- С++-cli
7
Напишите класс на C++/cli, который подключается к вашему коду C++.