Partilhar via


Especificando um ponto de entrada

Um ponto de entrada identifica o local de uma função em uma DLL. Dentro de um projeto gerenciado, o nome original ou o ponto de entrada ordinal de uma função de destino identifica essa função através do limite de interoperação. Além disso, você pode mapear o ponto de entrada para um nome diferente, efetivamente renomeando a função.

A seguir está uma lista de possíveis razões para renomear uma função DLL:

  • Para evitar o uso de nomes de função de API que diferenciam maiúsculas de minúsculas

  • Para cumprir os padrões de nomenclatura existentes

  • Para acomodar funções que usam tipos de dados diferentes (declarando várias versões da mesma função DLL)

  • Para simplificar o uso de APIs que contêm versões ANSI e Unicode

Este tópico demonstra como renomear uma função DLL em código gerenciado.

Renomeando uma função no Visual Basic

Visual Basic usa a palavra-chave Function na instrução Declare para definir o DllImportAttribute.EntryPoint campo. O exemplo a seguir mostra uma declaração básica.

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

Você pode substituir o ponto de entrada MessageBox por MsgBox incluindo a palavra-chave Alias em sua definição, conforme mostrado no exemplo a seguir. Em ambos os exemplos, a palavra-chave Auto elimina a necessidade de especificar a versão do conjunto de caracteres do ponto de entrada. Para obter mais informações sobre como selecionar um conjunto de caracteres, consulte Especificando um conjunto de caracteres.

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

Renomeando uma função em C# e C++

Você pode usar o DllImportAttribute.EntryPoint campo para especificar uma função DLL por nome ou ordinal. Se o nome da função em sua definição de método é o mesmo que o ponto de entrada na DLL, você não precisa identificar explicitamente a função com o campo EntryPoint . Caso contrário, use um dos seguintes formulários de atributo para indicar um nome ou ordinal:

[DllImport("DllName", EntryPoint = "Functionname")]
[DllImport("DllName", EntryPoint = "#123")]

Observe que você deve prefixar um ordinal com o sinal de libra (#).

O exemplo a seguir demonstra como substituir MessageBoxA por MsgBox em seu código usando o campo 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);

Consulte também