Określanie punktu wejścia
Punkt wejścia określa lokalizację funkcji w bibliotece DLL. W obrębie zarządzanego projektu, oryginalna nazwa lub porządkowy punkt wejścia docelowej funkcji określa tę funkcję wewnątrz międzyoperacyjnej granicy. Co więcej, możesz zmapować punkt wejścia do innej nazwy, efektywnie zmieniając nazwę funkcji.
Poniżej znajduje się lista możliwych przyczyn zmiany nazwy funkcji DLL:
Aby uniknąć używania nazw funkcji API wrażliwych na wielkość liter
Aby postępować zgodnie z istniejącymi standardami nazewnictwa
Aby pomieścić funkcje, które przyjmują różne typy danych (poprzez deklarację wielu wersji tej samej funkcji DLL)
Aby uprościć używanie API, które zawierają wersje ANSI i Unicode
Ten temat demonstruje, w jaki sposób zmienić nazwę funkcji DLL w kodzie zarządzanym.
Zmiana nazwy funkcji w języku Visual Basic
Visual Basic używa słowa kluczowego Function w instrukcji Declare , aby ustawić DllImportAttribute.EntryPoint pole. Poniższy przykład pokazuje podstawową deklarację.
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
Punkt wejścia MessageBox można zastąpić ciągiem MsgBox, dołączając słowo kluczowe Alias w definicji, jak pokazano w poniższym przykładzie. W obu przykładach słowo kluczowe Auto eliminuje konieczność określenia wersji zestawu znaków punktu wejścia. Aby uzyskać więcej informacji na temat wybierania zestawu znaków, zobacz Określanie zestawu znaków.
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
Zmiana nazwy funkcji w języku C# i C++
Można użyć pola DllImportAttribute.EntryPoint, aby określić funkcję DLL po nazwie lub liczbie porządkowej. Jeśli nazwa funkcji w definicji metody jest taka sama jak punkt wejścia w bibliotece DLL, nie trzeba jawnie identyfikować funkcji z polem EntryPoint . W innym wypadku, użyj jednego z poniższych form atrybutów, aby wskazać nazwę lub liczbę porządkową:
[DllImport("DllName", EntryPoint = "Functionname")]
[DllImport("DllName", EntryPoint = "#123")]
Należy zauważyć, że liczba porządkowa musi być poprzedzona znakiem kratki (#).
W poniższym przykładzie pokazano, jak zastąpić element MessageBoxA aplikacją MsgBox w kodzie przy użyciu pola EntryPoint .
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);