Consumindo funções de DLL não gerenciadasConsuming Unmanaged DLL Functions

A invocação de plataforma é um serviço que permite que um código gerenciado chame funções não gerenciadas implementadas em DLLs (bibliotecas de vínculo dinâmico), como aquelas na API do Windows.Platform invoke is a service that enables managed code to call unmanaged functions implemented in dynamic link libraries (DLLs), such as those in the Windows API. Ela localiza e invoca uma função exportada e realiza marshaling dos argumentos (inteiros, cadeias de caracteres, matrizes, estruturas e assim por diante) além do limite de interoperação, conforme necessário.It locates and invokes an exported function and marshals its arguments (integers, strings, arrays, structures, and so on) across the interoperation boundary as needed.

Esta seção apresenta as tarefas associadas às funções DLL não gerenciadas de consumo e fornece mais informações sobre invocação de plataforma.This section introduces tasks associated with consuming unmanaged DLL functions and provides more information about platform invoke. Além das tarefas a seguir, há considerações gerais e um link que fornece exemplos e informações adicionais.In addition to the following tasks, there are general considerations and a link providing additional information and examples.

Para consumir funções de DLL exportadasTo consume exported DLL functions

  1. Identifique as funções nas DLLs.Identify functions in DLLs.

    No mínimo, é necessário especificar o nome da função e o nome da DLL que ela contém.Minimally, you must specify the name of the function and name of the DLL that contains it.

  2. Crie uma classe para conter funções de DLL.Create a class to hold DLL functions.

    Use uma classe existente, crie uma classe individual para cada função não gerenciada ou crie uma classe que contém um conjunto de funções não gerenciadas relacionadas.You can use an existing class, create an individual class for each unmanaged function, or create one class that contains a set of related unmanaged functions.

  3. Crie protótipos em um código gerenciado.Create prototypes in managed code.

    [Visual Basic] Use a instrução Declare com as palavras-chave Function e Lib.[Visual Basic] Use the Declare statement with the Function and Lib keywords. Em alguns casos raros, é possível usar o DllImportAttribute com as palavras-chave Shared Function.In some rare cases, you can use the DllImportAttribute with the Shared Function keywords. Esses casos são explicados mais adiante nesta seção.These cases are explained later in this section.

    [C#] Use o DllImportAttribute para identificar a DLL e a função.[C#] Use the DllImportAttribute to identify the DLL and function. Marque o método com os modificadores static e extern.Mark the method with the static and extern modifiers.

    [C++] Use o DllImportAttribute para identificar a DLL e a função.[C++] Use the DllImportAttribute to identify the DLL and function. Marque o método wrapper ou a função com extern "C".Mark the wrapper method or function with extern "C".

  4. Chame uma função de DLL.Call a DLL function.

    Chame o método na classe gerenciada como faria com qualquer outro método gerenciado.Call the method on your managed class as you would any other managed method. Passar estruturas e implementar funções de retorno de chamada são casos especiais.Passing structures and implementing callback functions are special cases.

Para obter exemplos que demonstram como construir declarações baseadas no .NET a serem usadas com a invocação de plataforma, consulte Realizando marshaling de dados com a invocação de plataforma.For examples that demonstrate how to construct .NET-based declarations to be used with platform invoke, see Marshaling Data with Platform Invoke.

Visão aprofundada da invocação de plataformaA closer look at platform invoke

A invocação de plataforma se baseia nos metadados para localizar funções exportadas e realizar marshaling em seus argumentos em tempo de execução.Platform invoke relies on metadata to locate exported functions and marshal their arguments at run time. A ilustração a seguir mostra esse processo.The following illustration shows this process.

Diagrama que mostra uma chamada de invocação de plataforma.

Quando uma invocação de plataforma chama uma função não gerenciada, ela executa a seguinte sequência de ações:When platform invoke calls an unmanaged function, it performs the following sequence of actions:

  1. Localiza a DLL que contém a função.Locates the DLL containing the function.

  2. Carrega a DLL na memória.Loads the DLL into memory.

  3. Localiza o endereço da função na memória e efetua push de seus argumentos para a pilha, realizando marshaling dos dados, conforme necessário.Locates the address of the function in memory and pushes its arguments onto the stack, marshaling data as required.

    Observação

    A localização e o carregamento da DLL, bem como a localização do endereço da função na memória, ocorrem apenas na primeira chamada à função.Locating and loading the DLL, and locating the address of the function in memory occur only on the first call to the function.

  4. Transfere o controle para a função não gerenciada.Transfers control to the unmanaged function.

A invocação de plataforma gera exceções geradas pela função não gerenciada para o chamador gerenciado.Platform invoke throws exceptions generated by the unmanaged function to the managed caller.

Consulte tambémSee also