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

BestFitMapping

Désactive le meilleur mappage.

CallingConvention

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.

CharSet

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.

EntryPoint

Spécifie le point d'entrée de DLL à appeler.

ExactSpelling

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.

PreserveSig

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).

SetLastError

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.

ThrowOnUnmappableChar

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

Autres ressources

Appel à une fonction DLL