Книга: C# для профессионалов. Том II

Доступ к неуправляемому коду

Доступ к неуправляемому коду

Хотя .NET может взаимодействовать с неуправляемым кодом в любой DLL, чаще всего он взаимодействует с кодом в DLL, составляющим базовую функциональность Windows API. Это включает user32.dll, gdi32.dll и kernel32.dll. Процесс представления функций из этих DLL для кода .NET должен быть знаком любому, кто использовал ключевое слово Declare для предоставления вызовов Win32 API для кода VB6:

[sysimport(dll="user32.dll")]
public static extern int MessageBoxA(int Modal, string Message, string Caption, int Options);

В приведенном примере с помощью оболочки .NET вызова осуществляется вызов Windows API, который выводит окно с сообщением. В атрибуте выше функции оболочки определяется DLL, которой функция в оболочке должна делегировать свою работу. Теперь клиент кода .NET может вызывать функцию оболочки для вызова функций API:

MessageBoxA(0, "PInvoke worked!", "PInvoke Example", 0);

Хотя здесь для функции оболочки задано такое же имя, как и для вызова Windows API, в который она отображается, можно задать для нее и другое имя, как делалось в примере выше. Изменим теперь имя "MessageBox" на имя, которое более точно определяет, как будет использоваться вызов API. Сделаем это, определяя дополнительное значение в атрибуте sysimport:

[sysimport (dll="ustr32.dll", name="MessageBoxA") ]
public static extern int ErrorMessage(int Modal, string Message, string Caption, int Options);

При переименовании вызова Windows API таким образом клиенты могут вызывать функцию с новым именем:

ErrorMessage(0, "PInvoke worked!", "PInvoke.Example", 0);

Оглавление книги


Генерация: 1.336. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз