Void 샘플

이 샘플에서는 인수로 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 클래스에서는 메서드를 호출하고 열거형 요소를 초기화합니다. 첫 번째 방법에서는 각 열거형 요소를 지정하고 두 번째 방법에서는 가장 큰 값 형식과 문자열만 지정합니다.

프로토타입 선언

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);
};

함수 호출

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");
    }
};

참고 항목

개념

기타 마샬링 샘플

플랫폼 호출 데이터 형식

관리 코드에서 프로토타입 만들기