Как разобрать struct в C ++ dll из C #? - PullRequest
1 голос
/ 07 декабря 2009

Я пытаюсь вызвать функцию в неуправляемой DLL C ++.

Имеет этот прототип:

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

Вот как я определяю структуру BII_Template в C #:

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;

Ответы [ 4 ]

1 голос
/ 08 декабря 2009

После многократного тестирования кажется, что использование фиксированного символа ... не дает то же самое, что [MashalAs ...] После внесения изменений это сработало.

 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]

публичная структура BII_Template { публичный идентификатор uint; public 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;

};

0 голосов
/ 07 декабря 2009

Мой стандартный ответ: добавьте сборку C ++ / CLI в ваш проект C #. Тогда проблема решится сама собой.

0 голосов
/ 07 декабря 2009

«unsigned long» в C ++ НЕ равно ulong в C #.

Вместо этого используйте uint.

0 голосов
/ 07 декабря 2009

вам нужно использовать свойство structlayout.sequal на BII_Template, Google для деталей.

...