如何使用struct指针导入非托管dll?

时间:2013-09-24 02:18:04

标签: c# dllimport unmanaged

我可以DllImport常用功能,但未能导入这种类型,下面是DLL头文件。

typedef struct
{
   VOID (* API_GetUID)(CHAR *pData, DWORD DataLen);

   DWORD (* API_GetChipType)();

} API_FUNCTION_STRUCT, *API_FUNCTION_STRUCT;

extern VOID WINAPI GetAPIObject(API_FUNCTION_STRUCT *pApiFunc);

我无法在C#中编写正确的结构。

public struct test
    {
        IntPtr  API_GetUID(IntPtr pData, int DataLen);
        IntPtr      API_GetChipType();
    } 

[DllImport(@"GDevice.dll")]
public static extern void GetAPIObject(ref test test_a);

更新

public struct test
{
delegate void API_GetUID(IntPtr pData, int DataLen);
delegate void API_GetChipType();
}

1 个答案:

答案 0 :(得分:2)

您可能需要使用Marshal.GetDelegateForFunctionPointer function

这需要IntPtr指向本机方法,并为您提供可以调用的委托。

public struct test
{
    IntPtr API_GetUID;
    IntPtr API_GetChipType;
} 

[DllImport(@"GDevice.dll")]
public static extern void GetAPIObject(ref test test_a);

delegate void GetUID_Delegate(IntPtr pData, uint dataLen);
delegate uint GetChipType_Delegate();

test a = new test();
GetAPIObject(ref a);

GetUID_Delegate getUID = Marshal.GetDelegateForFunctionPointer<GetUID_Delegate>(a.API_GetUID);
GetChipType_Delegate getChipType = Marshal.GetDelegateForFunctionPointer<GetChipType_Delegate>(a.API_GetChipType);

uint chipType = getChipType();

修改

或者使用UnmanagedFunctionPointerAttribute

public struct test
{
    GetUID_Delegate API_GetUID;
    GetChipType_Delegate API_GetChipType;

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    delegate void GetUID_Delegate(IntPtr pData, uint dataLen);
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    delegate uint GetChipType_Delegate();
} 

[DllImport(@"GDevice.dll")]
public static extern void GetAPIObject(ref test test_a);

test a = new test();
GetAPIObject(ref a);

uint chipType = a.API_GetChipType();