Void 샘플
업데이트: 2007년 11월
이 샘플에서는 인수로 void 포인터를 필요로 하는 관리되지 않는 함수에 데이터를 전달하는 방법을 보여 줍니다. 이 샘플에서는 두 가지 솔루션을 제공합니다.
Void 샘플에서는 다음의 관리되지 않는 함수를 사용합니다. 이 함수는 원래의 함수 선언과 함께 표시되어 있습니다.
PinvokeLib.dll에서 내보낸 SetData
void SetData(DataType typ, void* object)
PinvokeLib.dll은 이 함수에 대한 구현이 포함된, 관리되지 않는 사용자 지정 라이브러리입니다.
이 샘플에서, LibWrap 클래스에는 하나의 형식 열거형과 두 개의 관리되는 프로토타입 메서드인 SetData 및 SetData2가 포함되어 있습니다. 이 두 메서드는 **void***를 필요로 하는 관리되지 않는 함수에 데이터를 전달하는 다음 방법을 나타냅니다.
SetData는 DataType 열거형 및 개체를 선언합니다. MarshalAsAttribute 특성은 UnmanagedType 열거형을 AsAny로 설정합니다. AsAny는 런타임에 개체의 형식을 결정하고 해당 개체를 결정된 형식으로 마샬링합니다.
SetData2는 메서드를 오버로드하여 DataType 열거형을 선언하고 double 또는 문자열 형식을 식별합니다. ref(Visual Basic에서는 ByRef) 키워드는 double을 참조로 전달합니다.
App 클래스에서는 메서드를 호출하고 열거형 요소를 초기화합니다. 첫 번째 방법에서는 각 열거형 요소를 지정하고 두 번째 방법에서는 가장 큰 값 형식과 문자열만 지정합니다.
다음 코드 예제의 소스 코드는 .NET Framework Platform Invoke 기술 샘플을 통해 제공됩니다.
프로토타입 선언
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 );
}
함수 호출
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" );
}
}