다음을 통해 공유


Platform Invoke 기술 샘플

업데이트: 2007년 11월

이 샘플에서는 관리되지 않는 라이브러리에서 내보낸 함수를 호출하는 방법을 보여 주며, 다음과 같은 작업을 하는 방법을 보여 줍니다.

  • 여러 가지 형식 선언

  • 사용 가능한 특성을 사용하여 기본 동작 수정

  • Marshal 형식의 메서드 사용

  • 가비지 수집과 스레딩 결과에 영향을 줄 수 있는 요소 확인

Windows 라이브러리에서 내보낸 함수를 사용하는 샘플도 있고, 사용자 지정 라이브러리에서 내보낸 함수를 사용하는 샘플도 있습니다. 특정 샘플의 경우에는 일부 Windows 플랫폼에서는 사용할 수 없는 라이브러리를 사용하거나 일부 Windows 플랫폼에서는 지원되지 않는 방법으로 함수를 사용합니다. 그래도 샘플에서 사용되는 특정 플랫폼 호출 규칙을 이해하는 데는 문제가 되지 않습니다.

이러한 샘플은 다음 디렉터리 구조로 구성됩니다.

디렉터리

내용

WinAPIs

Windows 라이브러리에서 내보낸 함수를 사용하여 보여 주는 플랫폼 호출

WinAPIs\CS

C#으로 작성된 소스

WinAPIs\VB

Visual Basic으로 작성된 소스

Custom

사용자 지정 형식 라이브러리에서 내보낸 함수를 사용하여 보여 주는 플랫폼 호출

Custom\CS

C#으로 작성된 소스

Custom\LIB

사용자 지정 형식 라이브러리 소스

Custom\VB

VB로 작성된 소스

샘플 사용에 대한 자세한 내용은 다음 항목을 참조하십시오.

Download sample

명령 프롬프트를 사용하여 샘플을 빌드하려면

  1. 명령 프롬프트 창을 열고 언어별 하위 디렉터리 중 하나로 이동합니다.

  2. 명령줄에서 msbuild [file name].sln을 입력합니다.

    참고:

    사용자 지정 플랫폼 호출 샘플은 Visual Studio로만 빌드할 수 있습니다.

Visual Studio를 사용하여 샘플을 빌드하려면

  1. Windows 탐색기를 열고 언어별 하위 디렉터리 중 하나로 이동합니다.

  2. [file name].sln 아이콘을 두 번 클릭하여 Visual Studio에서 해당 파일을 엽니다.

  3. 빌드 메뉴에서 솔루션 빌드를 선택합니다.

이 샘플을 실행하려면

  1. WinAPIs 또는 Custom 디렉터리 아래에서, 빌드된 실행 파일이 들어 있는 언어별 디렉터리 중 하나로 이동합니다.

  2. 명령줄에서 실행 파일 이름을 입력합니다.

    참고:

    이 샘플은 콘솔 응용 프로그램을 빌드합니다. 출력을 보려면 명령 프롬프트를 사용하여 응용 프로그램을 하나씩 별도로 시작해야 합니다.

요구 사항

Microsoft Visual Studio 2005를 사용하여 Visual Studio 2005 명령 프롬프트를 빌드하는 경우 또는 Platform SDK가 포함 경로에 설치 및 지정된 경우 이러한 샘플에는 프로젝트에 사용할 수 있는 Windows 헤더가 필요합니다.

설명

다음 표에서는 이러한 샘플에서 보여 주는 항목을 요약하고 해당 항목에 관련된 샘플의 소스 파일 위치를 보여 줍니다.

플랫폼 호출 특성을 사용하는 방법

특성

설명

샘플

EntryPoint

관리 코드에서 사용할 함수의 이름을 바꿉니다.

WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb

CharSet

문자열의 마샬링 방법을 선택합니다. 이 방법은 함수 이름 검색 조건에도 영향을 줍니다.

WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb

ExactSpelling

관리되지 않는 DLL의 진입점 이름을 CharSet 값에 따라 수정해야 하는지 여부를 나타냅니다.

WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb

CallingConvention

varargs가 있는 함수를 호출합니다.

WinAPIs\CS\Printf.cs WinAPIs\VB\Printf.vb

PreserveSig

HRESULT를 반환하는 함수를 수정합니다.

WinAPIs\CS\CreateObject.cs WinAPIs\VB\CreateObject.vb

SetLastError

함수 호출 후에 오류 코드가 저장되도록 합니다.

WinAPIs\CS\Errors.cs WinAPIs\VB\Errors.vb

구조체 및 공용 구조체를 마샬링하는 방법

형식

설명

샘플

ByVal 구조체

구조체를 In 매개 변수로 전달합니다.

Custom\CS\Structs.cs Custom\VB\Structs.vb

ByRef 구조체

구조체를 In/Out 매개 변수로 전달합니다.

WinAPIs\CS\OSInfo.cs WinAPIs\VB\OSInfo.vb

ByVal 클래스

In/Out 매개 변수로 정수 멤버만 사용하는 클래스를 전달합니다.

WinAPIs\CS\SysTime.cs WinAPIs\VB\SysTime.vb

중첩 구조체가 있는 구조체(결합 구조체)

관리되지 않는 측에서 중첩된 구조체가 있는 구조체를 나타내는 클래스를 만듭니다. 구조체가 관리되는 측에서 하나의 큰 구조체로 결합됩니다.

WinAPIs\CS\FindFile.cs WinAPIs\VB\FindFile.vb

중첩 구조체가 있는 구조체(결합되지 않는 구조체)

포함된 구조체가 있는 구조체를 전달합니다.

Custom\CS\Structs.cs Custom\VB\Structs.vb

다른 구조체에 대한 포인터가 포함된 구조체

다른 구조체에 대한 포인터가 포함된 구조체를 멤버로 전달합니다.

Custom\CS\Structs.cs Custom\VB\Structs.vb

정수 ByVal만 포함된 구조체 배열

정수만 포함된 구조체의 배열을 In/Out 매개 변수를 통해 전달합니다.

Custom\CS\Arrays.cs Custom\VB\Arrays.vb

정수 및 문자열 ByRef가 포함된 구조체 배열

정수 및 문자열이 포함된 구조체 배열을 Out 매개 변수를 통해 전달합니다. 호출 수신자가 배열에 메모리를 할당합니다.

Custom\CS\OutArrayOfStructs.cs Custom\VB\OutArrayOfStructs.vb

값 형식이 있는 공용 구조체

값 형식(정수 및 double)이 있는 공용 구조체를 전달합니다.

Custom\CS\Unions.cs Custom\VB\Unions.vb

혼합 형식이 있는 공용 구조체

혼합 형식(정수 및 문자열)이 있는 공용 구조체를 전달합니다.

Custom\CS\Unions.cs Custom\VB\Unions.vb

배열을 마샬링하는 방법

배열

설명

샘플

정수 ByVal 배열

정수 배열을 In/Out 매개 변수를 통해 전달합니다.

Custom\CS\Arrays.cs Custom\VB\Arrays.vb

정수 ByRef 배열

정수 배열을 In/Out 매개 변수를 통해 전달합니다. 배열 크기를 조정할 수 있습니다.

Custom\CS\Arrays.cs Custom\VB\Arrays.vb

정수 ByVal의 2D 배열

정수 매트릭스를 In/Out 매개 변수를 통해 전달합니다.

Custom\CS\Arrays.cs Custom\VB\Arrays.vb

기타

항목 형식

설명

샘플

HandleRef

가비지 수집을 못하도록 HandleRef를 사용해야 하는 경우를 나타냅니다.

WinAPIs\CS\HandleRef.cs WinAPIs\VB\HandleRef.vb

함수 포인터

함수 포인터를 필요로 하는 관리되지 않는 함수에 대리자를 전달합니다.

Custom\CS\Callback.cs Custom\VB\Callback.vb

void*

void*가 매개 변수로 포함된 함수를 호출합니다.

Custom\CS\Void.cs Custom\VB\Void.vb

LPARAM

GCHandle을 사용하여 관리되는 개체를 LPARAM이 필요한 관리되지 않는 함수에 전달합니다.

WinAPIs\CS\GCHandle.cs WinAPIs\VB\GCHandle.vb

STA(단일 스레드 아파트)/MTA(다중 스레드 아파트)

관리되지 않는 함수에서 CoInitialize를 호출할 때의 기본 아파트 설정을 변경합니다.

WinAPIs\CS\ActiveDir.cs WinAPIs\VB\ActiveDir.vb

플랫폼 호출에 대한 자세한 내용은 소스 코드 파일의 주석을 참조하십시오.

참고 항목

개념

관리되지 않는 DLL 함수 사용

플랫폼 호출 예제

참조

CharSet

DllImportAttribute

LayoutKind

Marshal

MarshalAsAttribute

StructLayoutAttribute

기타 리소스

기본 마샬링 동작

플랫폼 호출을 사용하여 데이터 마샬링