[英]How to parse struct to C++ dll from C#?
我試圖在非托管C ++ dll中調用函數。
它具有以下原型:
[DllImport("C:\\Program Files\\MySDK\\VSeries.dll", EntryPoint = "BII_Send_Index_Template_MT" )]
internal unsafe static extern Int32 BII_Send_Index_Template_MT(IntPtr pUnitHandle, ref BII_Template template, Int32 option, Boolean async);
BII_Template template = new BII_Template();
error_code = BII_Send_Index_Template_MT(pUnitHandle, ref template, option, false);
這就是我在C#中定義BII_Template結構的方法:
public unsafe struct BII_Template {
public ulong id;
public ulong employee_id;
public ulong password;
public byte sensor_version;
public byte template_version;
public fixed char name[16];
public byte finger;
public byte admin_level;
public byte schedule;
public byte security_thresh;
public fixed byte noise_level[18];
public byte corramb;
public byte reference_x;
public byte reference_y;
public fixed byte ihcore[3];
public fixed byte ivcore[3];
public byte temp_xoffset;
public byte temp_yoffset;
public byte index;
public fixed byte inphase[5500];
};
它生成,當我運行它時,dll返回error_code =“記錄校驗和無效。”
我以為我以錯誤的方式使用了ref
,或者結構中某些元素的大小錯誤。
-----編輯------------
這是C ++中的結構:
typedef struct {
unsigned long id;
unsigned long employee_id;
unsigned long password;
unsigned char sensor_version;
unsigned char template_version;
char name[16];
unsigned char finger;
unsigned char admin_level;
unsigned char schedule;
unsigned char security_thresh;
unsigned char noise_level[18];
unsigned char corramb ;
unsigned char reference_x ;
unsigned char reference_y ;
unsigned char ihcore[NUM_CORE];
unsigned char ivcore[NUM_CORE];
unsigned char temp_xoffset;
unsigned char temp_yoffset;
unsigned char index;
unsigned char inphase[PACKED_ARRAY_SIZE];
} BII_Template;
經過大量測試后,發現使用固定字符...與[MashalAs ...]的含義不同。 進行此更改后,它起作用了。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
公共結構BII_Template {public uint id; 公共uint employee_id; 公共uint密碼;
public byte sensor_version;
public byte template_version;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] name;
public byte finger;
public byte admin_level;
public byte schedule;
public byte security_thresh;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 18)]
public byte[] noise_level;
public byte corramb;
public byte reference_x;
public byte reference_y;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] ihcore;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] ivcore;
public byte temp_xoffset;
public byte temp_yoffset;
public byte index;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5500)]
public byte[] inphase;
};
我的標准答案:將C ++ / CLI程序集添加到C#項目。 然后問題將自行解決。
C ++中的'unsigned long'不等於C#中的ulong。
請改用uint。
您需要在BII_Template上使用structlayout.sequal屬性,請在google上獲取詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.