Compartilhar via


Como: Chamar nativo DLLs do código gerenciado usando PInvoke

Funções que são implementadas em DLLs não gerenciadas podem ser chamadas no código gerenciado usando a funcionalidade de invocação de plataforma (P/Invoke).Se o código-fonte para a DLL não estiver disponível, P/Invoke é a única opção para interoperar.No entanto, ao contrário de outras linguagens. NET, Visual C++ fornece uma alternativa para o P/Invoke.Para obter mais informações, consulte Usando a interoperabilidade de C++ (PInvoke implícita).

Exemplo

O exemplo de código a seguir usa o Win32 GetSystemMetricsfunção para recuperar a resolução corrente da tela em pixels.

Para funções que usam apenas tipos intrínsecos sistema autônomo argumentos e valores de retorno, não é necessário nenhum trabalho extra.Outros tipos de dados, sistema autônomo ponteiros de função, matrizes e estruturas, exigem atributos adicionais para garantir o marshaling de dados apropriados.

Embora não seja obrigatório, é recomendável tornar P/Invoke declarações de membros estático de uma classe de valor para que elas não existirem no namespace global, conforme demonstrado neste exemplo.

// pinvoke_basic.cpp
// compile with: /clr
using namespace System;
using namespace System::Runtime::InteropServices;

value class Win32 {
public:
   [DllImport("User32.dll")]
   static int GetSystemMetrics(int);

   enum class SystemMetricIndex {
      // Same values as those defined in winuser.h.
      SM_CXSCREEN = 0,
      SM_CYSCREEN = 1
   };
};

int main() {
   int hRes = Win32::GetSystemMetrics( safe_cast<int>(Win32::SystemMetricIndex::SM_CXSCREEN) );
   int vRes = Win32::GetSystemMetrics( safe_cast<int>(Win32::SystemMetricIndex::SM_CYSCREEN) );
   Console::WriteLine("screen resolution: {0},{1}", hRes, vRes);
}

Consulte também

Outros recursos

Usar PInvoke Explicit no C++ (atributo DllImport)