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 |
---|---|
Active ou désactive le mappage ajusté. |
|
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. |
|
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
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