Partager via


Comment : appeler des DLL natives à partir du code managé à l'aide de PInvoke

Les fonctions implémentées dans des DLL non managées peuvent être appelées à partir du code managé à l'aide de la fonctionnalité d'appel de code non managé (P/Invoke). Si le code source de la DLL n'est pas disponible, P/Invoke est la seule possibilité d'interaction. Toutefois, contrairement aux autres langages .NET, Visual C++ offre une alternative à P/Invoke. Pour plus d'informations, consultez Utilisation de l'interopérabilité C++ (PInvoke implicite).

Exemple

L'exemple de code suivant utilise la fonction Win32 GetSystemMetrics pour récupérer la résolution actuelle de l'écran en pixels.

Pour les fonctions qui utilisent uniquement des types intrinsèques comme arguments et qui retournent des valeurs, aucun travail supplémentaire n'est requis. D'autres types de données, tels que les pointeurs fonction, les tableaux et les structures, exigent des attributs supplémentaires pour garantir un marshaling correct des données.

Même si cela n'est pas obligatoire, il est conseillé de créer des membres statiques de déclarations P/Invoke d'une valeur afin qu'ils n'existent pas dans l'espace de noms global, comme illustré dans cet exemple.

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

Voir aussi

Autres ressources

Utilisation d'un PInvoke explicite en C++ (attribut DllImport)