エントリ ポイントの指定

エントリ ポイントは、DLL 内の関数の位置を識別します。 マネージド プロジェクト内では、対象となる関数の元の名前または序数エントリ ポイントによって、その関数が相互運用の境界にまたがって識別されます。 また、エントリ ポイントを別の名前に割り当てて、関数の名前を事実上変更できます。

DLL 関数の名前を変更する理由を次に示します。

  • 大文字と小文字が区別される API 関数名を使わないようにするため

  • 既存の名前付け標準に合わせるため

  • 異なるデータ型を受け取る複数の関数を共存させるため (同じ DLL 関数の複数のバージョンを宣言することによって)

  • ANSI バージョンと Unicode バージョンを持つ API の使用を簡単にするため

このトピックでは、マネージド コード内の DLL 関数の名前を変更する方法について説明します。

Visual Basic での関数名の変更

Visual Basic で DllImportAttribute.EntryPoint フィールドを設定するには、Declare ステートメントで Function キーワードを使います。 基本的な宣言を次の例に示します。

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++ での関数名の変更

DLL 関数を名前または序数で指定するには、DllImportAttribute.EntryPoint フィールドを使います。 メソッド定義内の関数の名前が 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);

関連項目