Como chamar DLLs nativas de código gerenciado usando PInvoke
As funções implementadas em DLLs não gerenciadas podem ser chamadas do código gerenciado usando a funcionalidade P/Invoke (Invocação de Plataforma). Se o código-fonte da DLL não estiver disponível, P/Invoke será a única opção para interoperação. No entanto, ao contrário de outras linguagens .NET, o Visual C++ fornece uma alternativa para P/Invoke. Para obter mais informações, confira Usando a interoperabilidade do C++ (PInvoke Implícito).
Exemplo
O exemplo de código a seguir usa a função Win32 GetSystemMetrics para recuperar a resolução atual da tela em pixels.
Para funções que usam apenas tipos intrínsecos como argumentos e valores retornados, nenhum trabalho extra é necessário. Outros tipos de dados, como ponteiros de função, matrizes e estruturas, exigem atributos adicionais para garantir o marshaling de dados adequado.
Embora não seja necessário, é uma boa prática tornar as declarações P/Invoke membros estáticos de uma classe de valor para que elas não existam 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);
}