Share via


진입점 지정

진입점은 DLL에서 함수의 위치를 식별합니다. 관리되는 프로젝트 내에서 대상 함수의 원래 이름이나 서수 진입점은 상호 운용 경계 간에 해당 함수를 식별합니다. 또한 진입점을 다른 이름에 매핑하여 효과적으로 함수 이름을 바꿀 수 있습니다.

다음은 DLL 함수 이름을 바꿀 수 있는 이유 목록입니다.

  • 대/소문자를 구분하는 API 함수 이름을 사용하지 않도록 하기 위해

  • 기존 명명 표준을 준수하기 위해

  • 동일한 DLL 함수의 여러 버전을 선언하여 다른 데이터 형식을 사용하는 함수를 수용하기 위해

  • ANSI 및 유니코드 버전을 포함하는 API 사용을 간소화하기 위해

이 항목에는 관리 코드에서 DLL 함수 이름을 바꾸는 방법을 보여 줍니다.

Visual Basic에서 함수 이름 바꾸기

Visual Basic에서는 Declare 문에 Function 키워드를 사용하여 DllImportAttribute.EntryPoint 필드를 설정합니다. 다음 예제에서는 기본 선언을 보여 줍니다.

Friend Class NativeMethods
    Friend Declare Auto Function MessageBox Lib "user32.dll" (
        ByVal hWnd As IntPtr,
        ByVal lpText As String,
        ByVal lpCaption As String,
        ByVal uType As UInteger) As Integer
End Class

다음 예제와 같이 정의에 Alias 키워드를 포함하여 MessageBox 진입점을 MsgBox로 바꿀 수 있습니다. 두 예제에서 모두 Auto 키워드를 사용하면 진입점의 문자 집합 버전을 지정할 필요가 없습니다. 문자 집합을 선택하는 방법에 대한 자세한 내용은 문자 집합 지정을 참조하세요.

Friend Class NativeMethods
    Friend Declare Auto Function MsgBox _
        Lib "user32.dll" Alias "MessageBox" (
        ByVal hWnd As IntPtr,
        ByVal lpText As String,
        ByVal lpCaption As String,
        ByVal uType As UInteger) As Integer
End Class

C# 및 C++에서 함수 이름 바꾸기

DllImportAttribute.EntryPoint 필드를 사용하여 DLL 함수를 이름 또는 서수로 지정할 수 있습니다. 메서드 정의의 함수 이름이 DLL의 진입점과 같으면 EntryPoint 필드를 사용하여 함수를 명시적으로 식별할 필요가 없습니다. 그러지 않으면 다음 특성 형식 중 하나를 사용하여 이름 또는 서수를 나타냅니다.

[DllImport("DllName", EntryPoint = "Functionname")]
[DllImport("DllName", EntryPoint = "#123")]

서수 앞에 파운드 기호(#)를 추가해야 합니다.

다음 예제에서는 EntryPoint 필드를 사용하여 코드에서 MessageBoxAMsgBox로 바꾸는 방법을 보여 줍니다.

using System;
using System.Runtime.InteropServices;

internal static class NativeMethods
{
    [DllImport("user32.dll", EntryPoint = "MessageBoxA")]
    internal static extern int MsgBox(
        IntPtr hWnd, string lpText, string lpCaption, uint uType);
}
using namespace System;
using namespace System::Runtime::InteropServices;

typedef void* HWND;
[DllImport("user32", EntryPoint = "MessageBoxA")]
extern "C" int MsgBox(
    HWND hWnd, String* lpText, String* lpCaption, unsigned int uType);

참고 항목