Beispiel zu "void"
Aktualisiert: November 2007
Diese Beispiel demonstriert, wie Daten an eine nicht verwaltete Funktion übergeben werden, die als Argument einen void-Zeiger erwartet. Das Beispiel stellt zwei Lösungen vor.
Das Void-Beispiel verwendet die folgende nicht verwaltete Funktion, die zusammen mit ihrer ursprünglichen Funktionsdeklaration aufgeführt wird:
SetData aus PinvokeLib.dll exportiert.
void SetData(DataType typ, void* object)
PinvokeLib.dll ist eine benutzerdefinierte, nicht verwaltete Bibliothek, die eine Implementierung für die zuvor aufgelistete Funktion enthält.
In diesem Beispiel enthält die LibWrap-Klasse eine Enumeration von Typen und zwei verwaltete Prototypmethoden: SetData und SetData2. Diese Methoden stellen die folgenden Vorgehensweisen für die Übergabe von Daten an eine nicht verwaltete Funktion dar, die void* erwartet:
SetData deklariert die DataType-Enumeration und ein Objekt. Das MarshalAsAttribute-Attribut legt die UnmanagedType-Enumeration auf AsAny fest. Dadurch wird der Typ eines Objekts zur Laufzeit bestimmt und das Objekt als dieser Typ gemarshallt.
SetData2 überlädt die Methode, um die DataType-Enumeration zu deklarieren und einen double- oder string-Typzu identifizieren. Das Schlüsselwort ref (ByRef in Visual Basic) übergibt den double-Typ durch einen Verweis.
Die App-Klasse ruft die Methoden auf und initialisiert die Enumerationselemente. Bei der ersten Vorgehensvariante wird jedes Enumerationselement angegeben, bei der zweiten nur der größte Werttyp und die Zeichenfolge.
Der Quellcode für die folgenden Codebeispiele wird im Technologiebeispiel für Plattformaufrufe in .NET Framework bereitgestellt.
Deklarieren von Prototypen
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 );
}
Aufrufen von Funktionen
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" );
}
}
Siehe auch
Konzepte
Verschiedene Marshallingbeispiele