Création de prototypes dans du code managé

Mise à jour : novembre 2007

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 code non managé, consultez Marshaling de données à l'aide de l'appel de code non managé.

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 code non managé crée la fonction et marshale les données vers et à partir de la fonction.

Remarque :

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 code non managé gère différemment ces paramètres. Pour les appels de code non managé, 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 obtenir des exemples de code plus complets, consultez Exemples d'appel de code non managé.

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, SetLastError ou 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 code non managé 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 code non managé. 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

Active ou désactive le mappage ajusté.

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 plateformes 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

Considérations relatives à la sécurité d'appel de code non managé

Identification des fonctions des DLL

Création d'une classe pour contenir des fonctions DLL

Autres ressources

Appel à une fonction DLL