Procedura: chiamare DLL native da codice gestito tramite PInvoke

Le funzioni implementate nelle DLL non gestite possono essere chiamate dal codice gestito usando la funzionalità Platform Invoke (P/Invoke). Se il codice sorgente per la DLL non è disponibile, P/Invoke è l'unica opzione per l'interoperabilità. Tuttavia, a differenza di altri linguaggi .NET, Visual C++ offre un'alternativa a P/Invoke. Per altre informazioni, vedere Uso dell'interoperabilità C++ (PInvoke implicito).For more information, see Using C++ Interop (Implicit PInvoke).

Esempio

L'esempio di codice seguente usa la funzione GetSystemMetrics Win32 per recuperare la risoluzione corrente dello schermo in pixel.

Per le funzioni che usano solo tipi intrinseci come argomenti e valori restituiti, non è necessario alcun lavoro aggiuntivo. Altri tipi di dati, ad esempio puntatori a funzione, matrici e strutture, richiedono attributi aggiuntivi per garantire il marshalling dei dati appropriato.

Anche se non è obbligatorio, è consigliabile creare membri statici delle dichiarazioni P/Invoke di una classe valore in modo che non esistano nello spazio dei nomi globale, come illustrato in questo esempio.

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

Vedi anche

Uso esplicito di PInvoke in C++ (attributo DllImport)