Partilhar via


Como chamar DLLs nativas a partir do código gerenciado usando PInvoke

As funções que são implementadas na DLL não gerenciado podem ser chamadas de código gerenciado usando a funcionalidade de invocação de plataforma (P/Invoke). Se o código-fonte do DLL não estiver disponível, P/Invoke é a única opção para interoperar. No entanto, diferentemente de outras linguagens .NET, Visual C++ fornece uma alternativa a P/Invoke. Para obter mais informações, consulte Usando interop C++ (PInvoke implícito).

Exemplo

O exemplo de código usa a função do Win32 GetSystemMetrics para recuperar a resolução atual da tela em pixels.

Para as funções que usam somente tipos intrínsecos como argumentos e valores de retorno, nenhum trabalho adicional é necessário. Outros tipos de dados, como ponteiros da função, matrizes, e estruturas, requerem atributos adicionais garantir o marshaling de dados apropriada.

Embora não se exija, uma boa prática fazer a declarações de P/Invoke membros estáticos de um valor de classificação para que não existem no namespace global, conforme mostrado 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

Usando PInvoke explícito em C++ (atributo DllImport)