다음을 통해 공유


진입점 지정

진입점은 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

다음 예제와 같이 정의에 별칭 키워드를 포함하여 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);

참고하십시오