Cómo: Llamar a archivos DLL nativos desde el código administrado mediante PInvoke

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

Se puede llamar a las funciones que se implementan en archivos DLL no administrados desde código administrado utilizando la funcionalidad de invocación de plataforma (P/Invoke). Si el código fuente para el archivo DLL no está disponible, P/Invoke es la única opción para interoperar. Sin embargo, al contrario que en otros lenguajes de .NET, Visual C++ proporciona una alternativa a P/Invoke. Para obtener más información, vea Utilizar la interoperabilidad de C++ (PInvoke implícito).

El ejemplo de código siguiente utiliza la función GetSystemMetrics de Win32 para recuperar la resolución actual de la pantalla en píxeles.

Para funciones que utilizan sólo tipos intrínsecos como argumentos y valores devueltos, no se requiere ningún trabajo adicional. Otros tipos de datos, como punteros a función, matrices y estructuras, requieren atributos adicionales para garantizar un cálculo de referencias de datos apropiado.

Aunque no es necesario, sí que es aconsejable hacer declaraciones P/Invoke miembros estáticos de una clase de valor, de modo que no existan en el espacio de nombres global, como se muestra en este ejemplo.

// 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);  
}  

Utilizar un elemento PInvoke explícito en C++ (Atributo DllImport)

Mostrar: