Exemplo de void
Este exemplo demonstra como passar dados para uma função não gerenciada que espera um void ponteiro como um argumento. O exemplo fornece duas soluções.
O exemplo de Void usa a seguinte função não gerenciada, mostrada com sua declaração de função original:
SetData exportados do 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, o LibWrap classe contém uma enumeração de tipos e dois métodos de protótipo gerenciados: SetData e SetData2. Esses métodos representam as seguintes abordagens para passar dados para uma função não gerenciada que esperando um void *:
SetDatadeclara o DataType enumeração e um objeto. O MarshalAsAttribute define o atributo de UnmanagedType enumeração para AsAny, que determina o tipo de um objeto em tempo de execução e empacota o objeto como tipo.
SetData2sobrecargas do método para declarar o DataType enumeração e para identificar um double ou seqüência de tipo. O ref (ByRef em Visual Basic) palavra-chave passa o duplo por referência.
O App chama os métodos de classe e inicializa os elementos de enumeração. A primeira abordagem Especifica cada elemento da enumeração. a segunda abordagem especifica somente o tipo de valor maior e a seqüência de caracteres.
A declaração de protótipos
Public Class LibWrap
Public Enum DataType
DT_I2 = 1
DT_I4
DT_R4
DT_R8
DT_STR
End Enum
' 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
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);
}
public ref class LibWrap
{
public:
enum class DataType
{
DT_I2 = 1,
DT_I4,
DT_R4,
DT_R8,
DT_STR
};
// Uses AsAny when void* is expected.
[DllImport("..\\LIB\\PInvokeLib.dll")]
static void SetData(DataType t,
[MarshalAs(UnmanagedType::AsAny)] Object^ o);
// Uses overloading when void* is expected.
[DllImport("..\\LIB\\PInvokeLib.dll", EntryPoint="SetData")]
static void SetData2( DataType t, double% i);
[DllImport("..\\LIB\\PInvokeLib.dll", EntryPoint="SetData")]
static void SetData2( DataType t, String^ s);
};
Chamando funções
Public Class App
Public Shared Sub Main()
Console.WriteLine("Calling SetData using AsAny..." + vbNewLine)
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(vbNewLine + "Calling SetData using overloading...")
Console.WriteLine(vbNewLine)
Dim d As Double = 12
LibWrap.SetData2(LibWrap.DataType.DT_R8, d)
LibWrap.SetData2(LibWrap.DataType.DT_STR, "abcd")
End Sub
End Class
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");
}
}
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, d);
LibWrap::SetData2(LibWrap::DataType::DT_STR, "abcd");
}
};
Consulte também
Conceitos
Diversos exemplos de empacotamento