Sommaire

Les directives [In] et [Out]

Au travers de ces exemples, nous avons utilisé les directives [In] et [Out] qui nous simplifient considérablement la tâche en nous évitant le codage :

  • Pour [In] :

  • Allocation d’une zone d’échange.

  • Copie avec conversion "marshal" de la variable C# dans la zone d’échange accessible par le C/C++.

  • Pour [Out] :

  • Copie avec conversion "marshal" de la variable C/C++ de la zone d’échange dans une variable C#.

  • Pour les deux :

  • Désallocation de la zone d’échange.

Voici ce que serait la partie C# du dernier exercice (projet PInvoke07 à télécharger) sans les directives [In] et [Out] :

[DllImport("Dll_C.dll", EntryPoint = "EnregistreClient", 
CallingConvention = CallingConvention.Cdecl)] 
static extern void EnregistreClient(IntPtr client); 
 
[StructLayout(LayoutKind.Sequential, Pack =1)] 
public struct Client 
{ 
    [MarshalAs(UnmanagedType.I1)] 
    public bool actif; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst =25)] 
    public char[] nom; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst =25)] 
    public char[] prenom; 
    public byte age; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst =20)] 
    public char[] telephone; 
    public int compteClient; 
} 
 
 
static void Main(string[] ...