Exemplo void
Este exemplo demonstra sistema autônomo passar dados para uma função não gerenciada que espera um void ponteiro sistema autônomo um argumento.O exemplo fornece duas soluções.
O exemplo void utiliza a seguinte função não gerenciada, mostrada com sua declaração de função original:
SetData exportados de PinvokeLib.dll.
void SetData(DataType typ, void* object)
PinvokeLib.dll é uma biblioteca de não gerenciada personalizada que contém uma implementação para a função listada anteriormente.
Neste exemplo, a LibWrap classe contém uma enumeração de tipos e dois métodos de protótipo gerenciado: SetData e SetData2.Esses métodos representam as seguintes abordagens para passar dados para uma função não gerenciada esperando um void *:
SetData declara o DataType enumeração e um objeto. The MarshalAsAttribute Define o atributo de UnmanagedType enumeração para AsAny, que determina o tipo de um objeto em time de execução e empacota o objeto sistema autônomo tipo.
SetData2 sobrecarrega o método para declarar o DataType enumeração e para identificar um double ou tipo de seqüência de caracteres. The ref (ByRef palavra-chave no Visual Basic) passa a dobra por referência.
The App classe chama os métodos e inicializa os elementos de enumeração. A primeira abordagem Especifica cada elemento da enumeração; a segunda abordagem especifica apenas o tipo de valor maior e a seqüência de caracteres.
O código-fonte para os exemplos de código a seguir é fornecido pelo.NET estrutura Invocação de plataforma Tecnologia Exemplo.
Declaração de protótipos
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 );
}
Chamando funções
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" );
}
}
Consulte também
Conceitos
Diversos exemplos de marshaling