Hello,
J'ai un soucis que je ne comprends pas encore très bien.
Je débute en c#, ça fait 2 ans que je suis sur du dev en C.
J'ai une lib codé en C qui est exporté en DLL.
Une des fonctions de la DLL attends un pointer de structure. Le pointer est là car c'est un tableau à passer.
la structure est celle-ci:
Code :
- typedef struct
- {
- char Channel_Name[32];
- int Channel_Index;
- double Channel_Range;
- eTermination Channel_Configuration;
- eUnit Channel_Unit;
- stSensors Sensor_Description;
- }Type_Channels_Description;
|
le prototype de la fonction C est la suivante:
Code :
- int DLLEXPORT Drv_AIBoard_Config(int Module, Type_Channels_Description *Channels_Description, int Channel_Number)
|
ça marche très bien sur mes autres appli codés en C.
Maintenant j'ai une autre app que je fait en C#, mais je réutilise la DLL en C.
j'ai chargé la dll et le prototype coté c# comme ça:
Code :
- [DllImport("C:/Applications/bin/NationalInstruments_NVH.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
- public static extern int Drv_AIBoard_Config(int Module, StructType_Channels_Description[] Channels_Description, int Channel_Number);
|
Au début j'avais ajouté le mot ref, mais au vus des printfs coté C j'avais une salade de pointer
La structure coté c# est comme ça:
Code :
- [StructLayout(LayoutKind.Sequential)]
- public unsafe struct StructType_Channels_Description
- {
- // public string Channel_Name; //marche pas a cause de taille non définit et de mémoire non managé.
- public fixed char Channel_Name[32];//32 bytes max !
- public int Channel_Index;
- public double Channel_Range;
- public Termination Channel_Configuration;
- public Unit Channel_Unit;
- public StructSensors Sensor_Description;
- }
|
D'après msdn je suis obligé d'utiliser le unsafe pour fixer la taille de la chaine de caractère.
Par contre j'ai un doute sur le layout sequential au vus de mon soucis.
Du coup ça semble bien compiler et tout, sauf que , quand je fait un printf coté C pour lire contenu, j'ai que le premier caractère de la chaine qui est bon, tout les autres champs de la struct sont à 0..
Des idées?
ps: une astuce pour que le déboguer puisse aller dans ma dll c?
Le code en C est fait avec National Instrument Labwindows/CVI
Message édité par jungledede le 16-12-2020 à 14:45:15
---------------
Monde de merde | Restez curieux