Практическое руководство. Вызов неуправляемых библиотек DLL из управляемого кода с помощью PInvoke

Функции, реализованные в неуправляемых библиотеках DLL, можно вызывать из управляемого кода с помощью функций P/Invoke. Если исходный код библиотеки DLL недоступен, P/Invoke является единственным вариантом взаимодействия. Однако, в отличие от других языков .NET, Visual C++ предоставляет альтернативу P/Invoke. Дополнительные сведения см. в разделе "Использование взаимодействия C++ (неявное PInvoke)".

Пример

В следующем примере кода функция GetSystemMetrics Win32 используется для получения текущего разрешения экрана в пикселях.

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

Хотя это не обязательно, рекомендуется сделать объявления 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)