Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp_Prog_Guide.doc
Скачиваний:
16
Добавлен:
16.11.2019
Размер:
6.22 Mб
Скачать

Создание класса, содержащего функции dll

Заключение часто используемой функции DLL в оболочку управляемого класса представляет собой эффективный способ инкапсуляции функциональных возможностей платформы. Хотя применение оболочки класса необязательно, оно удобно, так как процесс определения функций DLL может быть громоздким и представлять собой источник ошибок. При программировании на Visual Basic или C# функции DLL должны объявляться в пределах класса или модуля Visual Basic.

В классе для каждой вызываемой функции DLL должен быть определен статический метод. Определение может включать дополнительные сведения, например, кодировку или соглашение о вызовах, используемое при передаче аргументов метода. Если эти сведения отсутствуют, используются параметры по умолчанию.

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

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

  • Объявлять функции DLL в существующем классе.

  • Создавать для каждой функции DLL отдельный класс в целях изоляции и упрощения поиска функций.

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

Разработчик может назвать класс и его методы по своему усмотрению.

Creating Prototypes in Managed Code

This topic describes how to access unmanaged functions and introduces several attribute fields that annotate method definition in managed code. For examples that demonstrate how to construct .NET-based declarations to be used with platform invoke, see Marshaling Data with Platform Invoke.

Before you can access an unmanaged DLL function from managed code, you need to know the name of the function and the name of the DLL that exports it. With this information, you can begin to write the managed definition for an unmanaged function that is implemented in a DLL. Furthermore, you can adjust the way that platform invoke creates the function and marshals data to and from the function.

Note:

Win32 API functions that allocate a string enable you to free the string by using a method such as LocalFree. Platform invoke handles such parameters differently. For platform invoke calls, make the parameter an IntPtr type instead of a String type. Use methods that are provided by the System.Runtime.InteropServices..::.Marshal class to convert the type to a string manually and free it manually.

Declaration Basics

Managed definitions to unmanaged functions are language-dependent, as you can see in the following examples. For more complete code examples, see Platform Invoke Examples.

Создание прототипов в управляемом коде

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

Чтобы можно было обратиться к неуправляемой функции DLL из управляемого программного кода, требуется знать имя функции и имя библиотеки DLL, которая ее экспортирует. Располагая этими сведениями, разработчик может приступить к созданию управляемого описания для неуправляемой функции, реализованной в DLL. Кроме этого, можно настроить порядок создания функции при вызове неуправляемого кода, а также маршалинг данных в функцию и обратно.

Примечание.

Функции Win32 API, которые распределяют строку, позволяют освободить строку с помощью, например, метода LocalFree. При вызове неуправляемого кода эти параметры обрабатываются иначе. Для вызовов неуправляемого кода следует использовать параметр типа IntPtr, а не типа String. Чтобы вручную преобразовать тип в строку и вручную освободить его, можно использовать методы, предоставленные классом System.Runtime.InteropServices..::.Marshal.