![](/user_photo/1144_wzNgE.jpg)
- •Работа с неуправляемым кодом
- •Управляемый и неуправляемый код
- •Службы Platform Invoke
- •Службы com Interoperability
- •Обзор механизма преобразования
- •Работа службы Platform Invoke. Запуск функций WinApi
- •Управляемая библиотека
- •Управляемая библиотека в управляемом коде
- •Управляемая библиотека в неуправляемом коде
- •Вызов неуправляемых функций из управляемого модуля
- •Идентификация вызываемой функции
- •Создание класса для размещения библиотечной функции
- •Прототипы в управляемом коде
- •Небезопасный код
- •Григорьев с. .Net и работа с неуправляемым кодом. Часть 1 / с. Григорьев [Электронный ресурс] : http://habrahabr.Ru/blogs/net/84076/
Службы Platform Invoke
Службы Platform Invoke позволяют управляемому коду запускать функции неуправляемого кода, которые находятся в файлах библиотек динамической компоновки (DLL). Эти службы предоставляют механизмы обнаружения и запуска неуправляемых функций и преобразование типов данных входящих и исходящих аргументов функции. Когда управляемый код запускает функцию неуправляемого кода, локализованную в DLL-файле, службы Platform Invoke находят этот DLL файл, загружают его в оперативную память и находят адрес функции в памяти. После этого службы передают входящие аргументы функции в стек, преобразовывают данные, которые необходимо перевести, эмулируют сборку мусора и передают управление по адресу неуправляемой функции в памяти.
Службы com Interoperability
Объектная модель COM (Common Object Model) компонентов имеет некоторые существенные отличия от объектной модели компонентов .NET Framework.
Управление жизненным циклом объектов. Клиенты СОМ-объектов сами управляют этим циклом, среда CLR платформы .NET берет эту задачу на себя.
Обращение к службам и объектам. Клиенты COM-объектов узнают о функциональности службы путем опроса ее интерфейса, клиенты .NET-объектов могут получить описание функциональности, используя пространство имен Reflection.
Среда CLR перемещает объекты в памяти для улучшения производительности, обновляя ссылки этих объектов. Клиенты COM имеют постоянную ссылку на ячейки памяти, не изменяющуюся в течение всей жизни объекта.
Для преодоления этих различий CLR предлагает классы-оболочки, которые позволяют управляемым и неуправляемым клиентам думать, что они работают с объектами той же среды, что и они сами. Когда управляемый клиент вызывает неуправляемый метод, CLR создает временную оболочку RCW (Runtime Callable Wrapper). RCW абстрагирует различия между управляемым и неуправляемым кодом. CLR также создает оболочку CCW (COM Callable Wrapper) для обращения процесса, которая позволяет COM-объектам запускать методы .NET-объектов.
Обзор механизма преобразования
Механизм преобразования определяет, какие типы данных должны быть переданы в метод и возвращены методом из управляемого в неуправляемый код и наоборот. Большинство типов данных имеют свои аналоги как в управляемом, так и в неуправляемом коде. Они не нуждаются в конвертировании при передаче из одной среды в другую. В пространстве имен System такими типами данных являются следующие:
System.Byte
System.SByte
System.Int16
System.UInt16
System.Int32
System.UInt32
System.Int64
System.IntPtr
System.UintPtr
Но есть и такие типы данных, которые имеют неоднозначное значение в управляемом и неуправляемом языках программирования. Эти типы нуждаются в конвертировании при переходе из управляемого в неуправляемый код и наоборот. Например, управляемая строка (string) имеет несколько значений в неуправляемом коде. В таблице 1 представлен список типов данных, которые нуждаются в конвертировании при переходе из одной среды в другую.
Таблица 1. Конвертирование типов данных
Тип данных |
Тип при конвертировании |
System.Array |
C-style или SAFEARRAY |
System.Boolean |
1-, 2- или 4-битовое значение со значением true как 1 или –1 |
System.Char |
Символ кодировки ANSI или Unicode |
System.Class |
Интерфейс class |
System.Object |
Различные интерфейсы |
System.Mdarray |
C-style или SAFEARRAY |
System.String |
Строка с завершающим нулем (null-terminated string) или BSTR |
System.Valuetype |
Структура |
System.Szarray |
C-style или SAFEARRAY |
В большинстве случаев стандартные RCW и CCW, сгенерированные средой выполнения, предоставляют соответствующее преобразование типов между компонентами COM и .NET Framework. Используя атрибуты, вы можете настроить перевод из одного типа в другой.