방법: PInvoke를 사용하여 관리 코드로부터 네이티브 DLL 호출How to: Call Native DLLs from Managed Code Using PInvoke

관리 되지 않는 Dll에서 구현 되는 함수는 플랫폼 호출 (P/Invoke) 기능을 사용 하 여 관리 코드에서 호출할 수 있습니다.Functions that are implemented in unmanaged DLLs can be called from managed code using Platform Invoke (P/Invoke) functionality. DLL에 대 한 소스 코드를 사용할 수 없는 경우에는 P/Invoke가 상호 운용을 위한 유일한 옵션입니다.If the source code for the DLL is not available, P/Invoke is the only option for interoperating. 그러나 다른 .NET 언어와 달리 시각적 개체 C++ 는 P/Invoke에 대 한 대안을 제공 합니다.However, unlike other .NET languages, Visual C++ provides an alternative to P/Invoke. 자세한 내용은 Interop 사용 C++ (암시적 PInvoke)을 참조 하세요.For more information, see Using C++ Interop (Implicit PInvoke).

예제Example

다음 코드 예제에서는 Win32 Getsystemmetrics 함수를 사용 하 여 화면의 현재 해상도 (픽셀)를 검색 합니다.The following code example uses the Win32 GetSystemMetrics function to retrieve the current resolution of the screen in pixels.

인수 및 반환 값으로 내장 형식만 사용 하는 함수의 경우 추가 작업이 필요 하지 않습니다.For functions that use only intrinsic types as arguments and return values, no extra work is required. 함수 포인터, 배열 및 구조와 같은 기타 데이터 형식에는 적절 한 데이터 마샬링을 보장 하기 위해 추가 특성이 필요 합니다.Other data types, such as function pointers, arrays, and structures, require additional attributes to ensure proper data marshaling.

반드시 필요한 것은 아니지만,이 예제에서 보여 주는 것 처럼 전역 네임 스페이스에 존재 하지 않도록 P/Invoke 선언에 값 클래스의 정적 멤버를 설정 하는 것이 좋습니다.Although it is not required, it is good practice to make P/Invoke declarations static members of a value class so that they do not exist in the global namespace, as demonstrated in this example.

// 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);
}

참고 항목See also

C++에서 명시적 PInvoke 사용(DllImport 특성)Using Explicit PInvoke in C++ (DllImport Attribute)