Share via


Void, exemple

Mise à jour : novembre 2007

Cet exemple montre comment passer des données à une fonction non managée qui nécessite un pointeur void comme argument. L'exemple fournit deux solutions.

L'exemple Void utilise la fonction non managée suivante, illustrée avec sa déclaration de fonction d'origine :

  • SetData exportée à partir de PinvokeLib.dll.

    void SetData(DataType typ, void* object)
    

PinvokeLib.dll est une bibliothèque non managée personnalisée qui contient une implémentation pour la fonction précédemment répertoriée.

Dans cet exemple, la classe LibWrap contient une énumération de types et deux méthodes de prototype managé : SetData et SetData2. Ces méthodes représentent les approches suivantes permettant de passer des données à une fonction non managée qui attend un **void* **:

  • SetData déclare l'énumération DataType et un objet. L'attribut MarshalAsAttribute affecte à l'énumération UnmanagedType la valeur AsAny, qui détermine le type d'un objet au moment de l'exécution et le marshale en tant que tel.

  • SetData2 surcharge la méthode pour déclarer l'énumération DataType et pour identifier un type string ou un double. Le mot clé ref (ByRef en Visual Basic) passe le double par référence.

La classe App appelle les méthodes et initialise les éléments de l'énumération. La première approche spécifie chaque élément d'énumération ; la deuxième approche spécifie uniquement le type valeur le plus grand et la chaîne.

Le code source pour les exemples de code suivants est fourni par Appel de plate-forme, exemple de technologie du .NET Framework.

Déclaration de prototypes

Public Class LibWrap
   Public Enum DataType
      DT_I2 = 1
      DT_I4
      DT_R4
      DT_R8
      DT_STR
   End Enum 'DataType

   ' Uses AsAny when void* is expected.
   Declare Sub SetData Lib "..\LIB\PinvokeLib.dll" ( _
      ByVal t As DataType, < MarshalAs( UnmanagedType.AsAny )> ByVal o _
        As Object )
   ' Uses overloading when void* is expected.
   Overloads Declare Sub SetData2 Lib "..\LIB\PinvokeLib.dll" Alias _
       "SetData" ( ByVal t As DataType, ByRef d As Double )
   Overloads Declare Sub SetData2 Lib "..\LIB\PinvokeLib.dll" Alias _
       "SetData" ( ByVal t As DataType, ByVal s As String )
End Class 'LibWrap
public class LibWrap
{
   public enum DataType 
   {
      DT_I2 = 1,
      DT_I4,
      DT_R4,
      DT_R8,
      DT_STR
   }
   
   // Uses AsAny when void* is expected.
   [ DllImport( "..\\LIB\\PinvokeLib.dll" )]
   public static extern void SetData( DataType t, 
      [ MarshalAs( UnmanagedType.AsAny )] Object o );
   // Uses overloading when void* is expected.
   [ DllImport( "..\\LIB\\PinvokeLib.dll", EntryPoint="SetData" )]
   public static extern void SetData2( DataType t, ref double i );
   [ DllImport( "..\\LIB\\PinvokeLib.dll", EntryPoint="SetData" )]
   public static extern void SetData2( DataType t, String s );   
}

Appel de fonctions

Public Class App
   Public Shared Sub Main()
      Console.WriteLine( "Calling SetData using AsAny..." + _
         ControlChars.CrLf )
      LibWrap.SetData( LibWrap.DataType.DT_I2, CShort(12) )
      LibWrap.SetData( LibWrap.DataType.DT_I4, CLng(12) )
      LibWrap.SetData( LibWrap.DataType.DT_R4, CSng(12) )
      LibWrap.SetData( LibWrap.DataType.DT_R8, CDbl(12) )
      LibWrap.SetData( LibWrap.DataType.DT_STR, "abcd" )
      
      Console.WriteLine( ControlChars.CrLf + "Calling SetData _
         using overloading..." )
      Console.WriteLine( ControlChars.CrLf )   
      Dim d As Double   = 12
      LibWrap.SetData2( LibWrap.DataType.DT_R8, d )
      LibWrap.SetData2( LibWrap.DataType.DT_STR, "abcd" )
   End Sub 'Main
End Class 'App
public class App
{
   public static void Main()
   {
      Console.WriteLine( "Calling SetData using AsAny... \n" );
      LibWrap.SetData( LibWrap.DataType.DT_I2, (short)12 );
      LibWrap.SetData( LibWrap.DataType.DT_I4, (long)12 );
      LibWrap.SetData( LibWrap.DataType.DT_R4, (float)12 );
      LibWrap.SetData( LibWrap.DataType.DT_R8, (double)12 );
      LibWrap.SetData( LibWrap.DataType.DT_STR, "abcd" );
      
      Console.WriteLine( "\nCalling SetData using overloading... \n" );   
      double d = 12;
      LibWrap.SetData2( LibWrap.DataType.DT_R8, ref d );
      LibWrap.SetData2( LibWrap.DataType.DT_STR, "abcd" );
   }
}

Voir aussi

Concepts

Exemples divers de marshaling

Types de données d'appel de plate-forme

Création de prototypes dans du code managé