指定入口点
入口点标识 DLL 中的函数位置。 在托管项目中,目标函数的原始名称或序号入口点跨越互操作边界标识该函数。 此外,可将入口点映射到其他名称,有效地重命名该函数。
以下列表列出了重命名 DLL 函数的可能原因:
避免使用区分大小写的 API 函数名
符合现有的命名标准
提供采用不同数据类型的函数(通过声明同一 DLL 函数的多个版本)
简化对包含 ANSI 和 Unicode 版本的 API 的使用
本主题说明如何在托管代码中重命名 DLL 函数。
重命名 Visual Basic 中的函数
Visual Basic 在 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 关键字,可以用 MsgBox 替换 MessageBox 入口点 。 在这两个示例中,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);