관리 코드에서 프로토타입 만들기

업데이트: 2007년 11월

이 항목에서는 관리되지 않는 함수에 액세스하는 방법에 대해 설명하고 관리 코드에서 정의에 주석을 다는 특성 필드를 소개합니다. 플랫폼 호출에서 사용되는 .NET 기반 선언의 생성 방법을 보여 주는 예제는 플랫폼 호출을 사용하여 데이터 마샬링을 참조하십시오.

관리 코드에서 관리되지 않는 DLL 함수에 액세스하기 위해서는 먼저 함수의 이름과 해당 함수를 내보내는 DLL의 이름을 알고 있어야 합니다. 이러한 정보를 사용하면 DLL에 구현된 관리되지 않는 함수에 대한 관리되는 정의를 작성할 수 있을 뿐만 아니라 플랫폼 호출에서 함수를 만들고 함수에 대해 데이터를 마샬링하는 방법을 조정할 수 있습니다.

참고:

문자열을 할당하는 Win32 API 함수는 LocalFree와 같은 메서드를 사용하여 문자열을 해제하는데 플랫폼 호출은 이러한 매개 변수를 다르게 처리합니다. P/Invoke 호출의 경우에는 매개 변수를 String 형식이 아닌 IntPtr 형식으로 만들어야 합니다. System.Runtime.InteropServices.Marshal 클래스에서 제공되는 메서드를 사용하면 형식을 문자열로 변환하고 해당 형식을 해제하는 작업을 수동으로 수행할 수 있습니다.

선언 기본 사항

다음 예제에서 볼 수 있듯이, 관리되는 정의부터 관리되지 않는 함수는 모두 언어에 따라 다릅니다. 자세한 코드 예제를 보려면 플랫폼 호출 예제를 참조하십시오.

Imports System.Runtime.InteropServices
Public Class Win32
    Declare Auto Function MessageBox Lib "user32.dll" _
       (ByVal hWnd As Integer, _
        ByVal txt As String, ByVal caption As String, _
        ByVal Typ As Integer) As IntPtr
End Class

BestFitMapping, CallingConvention, ExactSpelling, PreserveSig, SetLastError 또는 ThrowOnUnmappableChar 필드를 Microsoft Visual Basic 2005 선언에 적용하려면 Declare 문 대신 DllImportAttribute 특성을 사용해야 합니다.

Imports System.Runtime.InteropServices
Public Class Win32
   <DllImport ("user32.dll", CharSet := CharSet.Auto)> _
   Public Shared Function MessageBox (ByVal hWnd As Integer, _
        ByVal txt As String, ByVal caption As String, _
        ByVal Typ As Integer) As IntPtr
   End Function
End Class
using System.Runtime.InteropServices;
[DllImport("user32.dll")]
    public static extern IntPtr MessageBox(int hWnd, String text, 
                                       String caption, uint type);
using namespace System::Runtime::InteropServices;
[DllImport("user32.dll")]
    extern "C" IntPtr MessageBox(int hWnd, String* pText,
    String* pCaption unsigned int uType);

정의 조정

특성 필드를 명시적으로 설정했는지 여부와 상관 없이 특성 필드는 관리 코드의 동작을 정의합니다. 플랫폼 호출은 어셈블리에 메타데이터로 존재하는 다양한 필드에 설정된 기본값에 따라 작동하며, 사용자는 하나 이상의 필드 값을 조정하여 이러한 기본 동작을 변경할 수 있습니다. 대부분의 경우 DllImportAttribute 속성을 사용하여 값을 설정할 수 있습니다.

다음 표에서는 플랫폼 호출과 관련된 모든 특성 필드를 나열하며 각 필드의 기본값 및 이들 필드를 사용하여 관리되지 않는 DLL 함수를 정의하는 방법에 대한 설명으로의 링크를 표시합니다.

필드

설명

BestFitMapping

BestFitMapping을 사용하거나 사용하지 않습니다.

CallingConvention

메서드 인수를 전달할 때 사용할 호출 규칙을 지정합니다. 기본값은 WinAPI이며, 이 값은 32비트 Intel 기반 플랫폼일 경우에는 __stdcall에 해당합니다.

CharSet

이름에 형식을 표시하는 방법 및 문자열 인수가 함수에 마샬링되는 방법을 제어합니다. 기본값은 CharSet.Ansi입니다.

EntryPoint

호출할 DLL 진입점을 지정합니다.

ExactSpelling

진입점을 문자 집합에 해당하도록 수정해야 하는지 여부를 제어합니다. 기본값은 프로그래밍 언어에 따라 다릅니다.

PreserveSig

HRESULT를 반환하며 반환값에 추가 인수 [out, retval]이 포함된 관리되지 않는 시그니처로 관리되는 메서드 시그니처를 변환할 수 있는지 여부를 제어합니다.

기본값은 true이며 시그니처는 변환되지 않아야 합니다.

SetLastError

호출자는 Marshal.GetLastWin32Error API 함수를 사용하여 메서드 실행 시 오류가 발생했는지 여부를 확인할 수 있습니다. Visual Basic에서는 기본값이 true이며, C# 및 C++에서는 기본값이 false입니다.

ThrowOnUnmappableChar

ANSI "?" 문자로 변환되는 매핑할 수 없는 유니코드 문자에서 예외를 throw하는 방식을 제어합니다.

자세한 참조 정보는 DllImportAttribute 클래스를 참조하십시오.

참고 항목

개념

관리되지 않는 DLL 함수 사용

진입점 지정

문자 집합 지정

플랫폼 호출 예제

플랫폼 호출 보안 고려 사항

DLL 함수 식별

DLL 함수가 포함된 클래스 만들기

기타 리소스

DLL 함수 호출