방법: 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);
}