Практическое руководство. Вызов неуправляемых библиотек DLL из управляемого кода с помощью PInvoke
Обновлен: Ноябрь 2007
Функции, реализованные в неуправляемых библиотеках DLL, могут вызываться из управляемого кода с помощью вызова неуправляемого кода P/Invoke. Если исходный код библиотеки DLL недоступен, вызов P/Invoke является единственным вариантом обеспечения взаимодействия. В отличие от других языков .NET в Visual C++ предусматривается альтернатива вызову P/Invoke. Дополнительные сведения см. в разделе Использование взаимодействия языка C++ (неявный PInvoke).
Пример
В следующем примере функция Win32 GetSystemMetrics используется для получения текущего значения разрешения экрана в точках.
Для функций, в которых используются аргументы и возвращаемые значения встроенных типов, дополнительные действия не требуются. Для других типов данных, например указателей на функции, массивов и структур, требуется наличие дополнительного атрибута, гарантирующего правильный маршалинг данных.
Рекомендуется (но не обязательно) объявлять вызовы P/Invoke как статические члены класса значений, что позволяет не включать их в глобальное пространство имен, как показано в следующем примере.
// pinvoke_basic.cpp
// compile with: /clr
using namespace System;
using namespace System::Runtime::InteropServices;
value class Win32 {
public:
[DllImport("User32.dll")]
static int GetSystemMetrics(int);
enum class SystemMetricIndex {
// Same values as those defined in winuser.h.
SM_CXSCREEN = 0,
SM_CYSCREEN = 1
};
};
int main() {
int hRes = Win32::GetSystemMetrics( safe_cast<int>(Win32::SystemMetricIndex::SM_CXSCREEN) );
int vRes = Win32::GetSystemMetrics( safe_cast<int>(Win32::SystemMetricIndex::SM_CYSCREEN) );
Console::WriteLine("screen resolution: {0},{1}", hRes, vRes);
}
См. также
Другие ресурсы
Использование явного вызова Pinvoke в C++ (атрибут DllImport)