我可以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();
}
答案 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();