14_C#_PInvoke.pptx
- Количество слайдов: 16
Атрибут Dll. Import ü Platform Invocation Services (PInvoke) поддерживает средства для вызова кода неуправляемых функций, которые находятся в DLL. ü При вызове неуправляемой функции из DLL компилятор C# должен иметь информацию • о прототипе неуправляемой функции; • в какой Dll-библиотеке находится функция; • как передаются параметры и возвращаемое значение. ü Атрибут Dll. Import дает возможность связать статический метод класса с внешними функциями из DLL. [Attribute. Usage(Attribute. Targets. Method)] public sealed class Dll. Import. Attribute : Attribute ü Атрибут Dll. Import имеет один обязательный параметр типа string – имя библиотеки динамической компоновки. ü Остальные параметры атрибута – необязательные (именованные).
Сервис PInvoke ü Platform Invocation Services (PInvoke) использует метаданные для поиска экспортируемой функции и маршалинга параметров в период выполнения. Рисунок из раздела MSDN – A Closer Look at Platform Invoke ü Сервис PInvoke загружает Dll-библиотеку в память, размещает параметры в стеке, передает исключения из неуправляемого кода в управляемый.
Взаимодействие управляемого и неуправляемого кода Sonja Keserovic, David Mortenson, Adam Nathan An Overview of Managed/Unmanaged Code Interoperability Microsoft Corporation, October 2003
Атрибут Dll. Import. Пример using System; using System. Runtime. Interop. Services; namespace PInvoke_Demo { class Class 1 { static void Main(string[] args) { bool res; try { double par 1 = 3; double par 2 = 0; res = F 1(par 1, ref par 2); } catch (System. Runtime. Interop. Services. External. Exception ex ) { Console. Write. Line(ex. Message); } } [Dll. Import("DLL_For. CSharp. dll")] public static extern bool F 1(double par 1, ref double par 2); }}
Атрибут Dll. Import. Пример. Код C++ extern "C" { _declspec(dllexport) bool F 1(double d 1, double& d 2) { if ( d 1<100) {d 2 = d 1*2; d 1 = -1; } else throw 1; return true; }} ü При создании Dll-файла компоновщик добавляет в исполняемый код раздел экспорта – таблицу экспортируемых функций. ü Экспортируемая функция • либо имеет модификатор _declspec(dllexport); • либо находится в разделе EXPORTS файла определения модуля (*. def); ü extern “C” – спецификация для компоновщика, определяет соглашения о вызове функций (calling convention).
Именованные параметры атрибута Dll. Import ü Некоторые именованные параметры атрибута Dll. Import: string Entry. Point Имя входной точки в Dll-библиотеке. По умолчанию – имя метода, к которому прикреплен атрибут. Calling. Convention Значение перечисления Calling. Convention, которое определяет соглашение о вызове функций, используемое для входной точки Dll-библиотеки. По умолчанию – Calling. Convention. Win. API. Char. Set Значение перечисления Char. Set, которое определяет набор символов, используемых во входной точке Dllбиблиотеки. По умолчанию – Char. Set. Auto, т. е. при маршалинге в зависимости от OC выбирается Unicode или ANSI. bool Exact. Spelling Умолчание false. При значении true Entry. Point должно точно совпадать с именем точки входа (для Win 32 API).
Calling. Convention ü Значение параметра Calling. Convention определяет соглашение о вызове функций, используемое для входной точки Dll-библиотеки. Значение параметра должно отвечать тому соглашению, которое использовалось при компиляции библиотеки. ü Соглашение о вызове функций определяет • порядок, в котором параметры функции размещаются в стеке; • какая из функций – вызывающая или вызываемая - удаляет параметры из стека при завершении вызова; • внутреннее имя для функции ( decorated name). ü При создании Dll-библиотеки соглашения о вызове функции определяются опциями компилятора, которые устанавливают соглашения для всех функций, для которых они не указаны явно. ü В коде C/C++ можно явно указать соглашения с помощью ключевых слов __cdecl __stdcall __fastcall
Calling. Convention ü Значения перечисления Calling. Convention Cdecl Соглашения С Std. Call Соглашения Win 32 API (умолчание при вызове неуправляемого метода) This. Call Соглашения С++ для методов классов Winapi Fast. Call Умолчание для платформы, например, Cdecl для Windows CE. . Net Framework 2. 0 не поддерживается.
Атрибут Marshal. As ü Атрибут Marshal. As определяет, как передаются данные между управляемым и неуправляемым кодом. Используется в основном при взаимодействии с COM-объектами. ü Для каждого примитивного. NET типа есть принятый по умолчанию соответствующий тип в неуправляемом коде. Атрибут Marshal. As дает возможность переопределить эти соглашения. [Attribute. Usage(Attribute. Targets. Field | Attribute. Targets. Parameter | Attribute. Targets. Return. Value)] public sealed class Marshal. As. Attribute : Attribute ü Атрибут Marshal. As имеет один обязательный параметр – значение перечисления Unmanaged. Type и 7 именованных (необязательных). ü Перечисление Unmanaged. Type имеет более 30 полей.
Copying and pinning ü Маршалинг (marshaling) – упаковка данных в стандартный формат для обмена между COM-объектами. ü При маршалинге данные могут копироваться (copying) или прикрепляться (pinning). copying (копирование) данные копируются из одной области памяти в другую. pinning (прикрепление) данные в управляемой куче временно фиксируются (их не перемещает сборщик мусора). По сравнению с копированием это более быстрый способ передачи данных. ü Способ маршалинга определяется типом данных.
Маршалинг типов-значений ü Для типов-значений всегда выполняется копирование. Рисунок из раздела MSDN - Copying and Pinning
Маршалинг ссылочных типов по значению ü Для ссылочных типов, которые передаются по значению, может выполняться копирование или прикрепление. Рисунок из раздела MSDN - Copying and Pinning
Blittable типы ü Типы, которые имеют одинаковое представление в управляемой и неуправляемой памяти, и не требуют преобразования при передаче из управляемого кода в неуправляемый, называются blittable. ü Прикрепление (pinning) при маршалинге выполняется только для blittable типов. blittable типы: System. Byte System. Int 32 System. Int. Ptr System. Double System. SByte System. UInt 32 System. UInt. Ptr System. Single System. Int 16 System. Int 64 System. UInt 16 одномерные массивы из элементов blittable-типов. System. String и System. Boolean - non-blittable типы.
Маршалинг типа bool ü Данные типа bool имеют разные представления в неуправляемом коде. Если явно не указан атрибут Marshal. As , по умолчанию используется значение Unmanaged. Type. Bool. Значение перечисления Unmanaged. Type Формат в неуправляемом коде Unmanaged. Type. Bool 4 -байтовое целое значение, любое ненулевое значение трактуется как TRUE, 0 как FALSE. Unmanaged. Type. U 1 1 -байтовое целое значение, значение 1 используется для TRUE, 0 для FALSE. Используется для типа bool в C++. Unmanaged. Type. Variant. Bool 2 -байтовое целое значение, где значение -1 используется для TRUE, 0 для FALSE.
Маршалинг строк ü Типы, которые передаются по значению, по умолчанию передаются как Inпараметры. ü Исключение – System. Text. String. Builder. Когда объекты этого типа передаются по значению, код получает доступ к внутреннему буферу с массивом символов. Неуправляемый код может изменять символы, но не может выходить за границы массива. ü Строки System. String всегда копируются в промежуточный буфер.
Маршалинг ссылочных типов по ссылке ü Для ссылочных типов, которые передаются по ссылке, всегда выполняется копирование. Рисунок из раздела MSDN - Copying and Pinning
14_C#_PInvoke.pptx