Création de prototypes dans du code managé
Cette rubrique décrit comment accéder à des fonctions non managées et présente plusieurs champs d'attribut qui annotent la définition des méthodes dans du code managé. Pour voir des exemples montrant comment construire des déclarations .NET à utiliser avec l'appel de plate-forme, consultez Marshaling de données à l'aide de l'appel de plate-forme.
Pour pouvoir accéder à une fonction DLL non managée à partir du code managé, vous devez préalablement connaître le nom de la fonction et le nom de la DLL qui l'exporte. Grâce à ces informations, vous pouvez commencer à écrire la définition managée de la fonction non managée implémentée dans une DLL. De plus, vous pouvez ajuster la manière dont l'appel de plate-forme crée la fonction et marshale les données vers et à partir de la fonction.
Notes
Les fonctions de l'interface API Win32 qui allouent une chaîne vous permettent de libérer la chaîne à l'aide d'une méthode telle que LocalFree. L'appel de plate-forme gère différemment ces paramètres. Pour les appels de plate-forme, affectez au paramètre le type IntPtr au lieu du type String. Utilisez les méthodes fournies par la classe System.Runtime.InteropServices.Marshal pour convertir manuellement le type en chaîne et le libérer manuellement.
Notions de base sur les déclarations
Les définitions managées des fonctions non managées dépendent du langage, comme vous pouvez le constater dans les exemples suivants. Pour afficher tous les langages, cliquez sur le bouton Filtre de langue dans l'angle supérieur gauche de la page. Pour obtenir des exemples de code plus complets, consultez Exemples d'appel de plate-forme.
Imports System.Runtime.InteropServices
Public Class Win32
Declare Auto Function MessageBox Lib "user32.dll" _
(ByVal hWnd As Integer, _
ByVal txt As String, ByVal caption As String, _
ByVal Typ As Integer) As IntPtr
End Class
Pour appliquer les champs BestFitMapping, CallingConvention, ExactSpelling, PreserveSig ou SetLastError ThrowOnUnmappableChar à une déclaration Microsoft Visual Basic 2005, vous devez utiliser DllImportAttribute au lieu de l'instruction Declare.
Imports System.Runtime.InteropServices
Public Class Win32
<DllImport ("user32.dll", CharSet := CharSet.Auto)> _
Public Shared Function MessageBox (ByVal hWnd As Integer, _
ByVal txt As String, ByVal caption As String, _
ByVal Typ As Integer) As IntPtr
End Function
End Class
using System.Runtime.InteropServices;
[DllImport("user32.dll")]
public static extern IntPtr MessageBox(int hWnd, String text,
String caption, uint type);
using namespace System::Runtime::InteropServices;
[DllImport("user32.dll")]
extern "C" IntPtr MessageBox(int hWnd, String* pText, String* pCaption,
unsigned int uType);
Ajustement de la définition
Que vous les définissiez explicitement ou non, les champs d'attribut procèdent à la définition du comportement du code managé. L'appel de plate-forme fonctionne en fonction des valeurs par défaut affectées aux différents champs qui existent sous la forme de métadonnées dans un assembly. Vous pouvez modifier ce comportement par défaut en ajustant les valeurs d'un ou de plusieurs champs. Dans de nombreux cas, vous utilisez DllImportAttribute pour affecter une valeur.
Le tableau suivant répertorie tous les champs d'attribut se rapportant à l'appel de plate-forme. Pour chaque champ, le tableau indique la valeur par défaut et un lien vers des informations sur le mode d'utilisation de ces champs pour définir des fonctions DLL non managées.
Champ | Description |
---|---|
Désactive le meilleur mappage. |
|
Spécifie la convention d'appel à utiliser lors du passage des arguments de méthodes. La valeur par défaut est WinAPI, qui correspond à __stdcall pour des plates-formes Intel 32 bits. |
|
Contrôle la décomposition des noms et le mode de marshaling des arguments de chaîne sur la fonction. La valeur par défaut est CharSet.Ansi. |
|
Spécifie le point d'entrée de DLL à appeler. |
|
Contrôle si un point d'entrée doit être modifié pour correspondre au jeu de caractères. La valeur par défaut varie en fonction du langage de programmation. |
|
Contrôle si la signature de la méthode managée doit être transformée en signature non managée retournant un HRESULT et si elle peut comporter un argument supplémentaire [out, retval] pour la valeur de retour. La valeur par défaut est true (la signature ne doit pas être transformée). |
|
Permet à l'appelant d'utiliser la fonction API Marshal.GetLastWin32Error pour déterminer si une erreur s'est produite lors de l'exécution de la méthode. En Visual Basic, la valeur par défaut est true ; en C# et C++, la valeur par défaut est false. |
|
Contrôle la levée d'une exception sur un caractère Unicode non mappable converti en caractère ANSI « ? ». |
Pour plus d'informations de référence, consultez DllImportAttribute, classe.
Voir aussi
Concepts
Consommation de fonctions DLL non managées
Spécification d'un point d'entrée
Spécification d'un jeu de caractères
Exemples d'appel de plate-forme
Identification des fonctions des DLL
Création d'une classe pour contenir des fonctions DLL