Share via


방법: PInvoke를 사용하여 관리 코드로부터 네이티브 DLL 호출

관리되지 않는 DLL에서 구현되는 함수는 P/Invoke(Platform Invoke) 기능을 사용하여 관리 코드에서 호출할 수 있습니다. DLL에 대한 소스 코드를 사용할 수 없는 경우 P/Invoke만 상호 운용할 수 있습니다. 그러나 다른 .NET 언어와 달리 Visual C++는 P/Invoke에 대한 대안을 제공합니다. 자세한 내용은 C++ Interop 사용(암시적 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);
}

참고 항목

C++에서 명시적 PInvoke 사용(DllImport 특성)