Procedura: chiamare DLL native da codice gestito tramite PInvoke
Le funzioni implementate nelle DLL non gestite possono essere chiamate utilizzando la funzionalità P/Invoke. Se il codice sorgente della DLL non è disponibile, P/Invoke è l'unica opzione per l'interoperabilità. Tuttavia, a differenza di altri linguaggi .NET, in Visual C++ viene fornita un'alternativa a P/Invoke. Per ulteriori informazioni, vedere Utilizzo delle funzionalità di interoperabilità C++ (PInvoke implicito).
Esempio
Nell'esempio di codice riportato di seguito viene utilizzata la funzione Win32 GetSystemMetrics per recuperare la risoluzione corrente dello schermo, in pixel.
Per le funzioni che utilizzano soltanto tipi intrinseci come argomenti e valori restituiti, non sono necessarie ulteriori operazioni. Altri tipi di dati, ad esempio puntatori a funzione, matrici e strutture, richiedono attributi aggiuntivi per garantire la corretta esecuzione del marshalling dei dati.
Anche se non è indispensabile, si consiglia di creare dichiarazioni P/Invoke per i membri statici di una classe di valori in modo che non siano definiti nello spazio dei nomi globali, 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);
}