エントリ ポイントは、DLL 内の関数の場所を識別します。 マネージド プロジェクト内では、ターゲット関数の元の名前または序数エントリ ポイントによって、相互運用境界を越えてその関数が識別されます。 さらに、エントリ ポイントを別の名前にマップし、関数の名前を効果的に変更できます。
DLL 関数の名前を変更する理由の一覧を次に示します。
大文字と小文字を区別する API 関数名の使用を回避するには
既存の名前付け基準に準拠するには
異なるデータ型を受け取る関数に対応するため (同じ DLL 関数の複数のバージョンを宣言する)
ANSI バージョンと Unicode バージョンを含む 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 フィールドを使用して、コード内の MessageBoxA を MsgBox に置き換える方法を示します。
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);
こちらも参照ください
.NET