Bonjour,

je dois implémenter une dll C++ native depuis un projet C#

Dans ma dll, j'ai cette structure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
typedef struct MaStruct
{<div style="margin-left:40px">unsigned int param1;
unsigned int param2;
float        param3;
unsigned int param4;
unsigned int param5;
unsigned int param6;
double       param7;</div>}MA_STRUCT;
et cette méthode :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
extern "C" __declspec(dllexport) void MaMethode(MA_STRUCT stTab[])
{<div style="margin-left:40px">// remplissage du tableau...</div>}
Donc, c'est cette méthode que je voudrais implémenter dans mon projet C#.

J'ai créé une structure équivalente :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[StructLayout(LayoutKind.Explicit)]
public struct MaStruct
{<div style="margin-left:40px">[FieldOffset(0)]
public unit param1;
 
[FieldOffset(4)]
public unit param2;
 
[FieldOffset(8)]
public float param3;
 
[FieldOffset(12)]
public unit param4;
 
[FieldOffset(16)]
public unit param5;
 
[FieldOffset(20)]
public unit param6;
 
[FieldOffset(24)]
public double param7;</div>}
J'ai importé la méthode de la dll :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
[DllImport("maDll.dll")]
unsafe protected static extern void MaMethode(byte[] tabStruct);
Je crois savoir qu'il faille que je mette 'à plat' ma structure sous forme de tableau d'octets
mais je ne sais pas trop comment m'y prendre...

J'ai essayé de faire ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
unsafe
{<div style="margin-left:40px">byte[] tabOctets = new byte[struct.Length*32];
// où 'struct' est un tableau de MaStruct
// et 32 car ma structure prend 32 octets...
 
for(int i=0; i<struct.Length; i++)
{<div style="margin-left:40px">tabOctets[i*4] = &struct[i].param1;
tabOctets[(i+1)*4] = &struct[i].param2;
tabOctets[(i+2)*4] = &struct[i].param3;
tabOctets[(i+3)*4] = &struct[i].param4;
tabOctets[(i+4)*4] = &struct[i].param5;
tabOctets[(i+5)*4] = &struct[i].param6;
tabOctets[(i+6)*4] = &struct[i].param7;</div>}</div>}
mais ça ne marche pas...

donc comment faire?
est-ce bien la bonne méthode??

merci de m'apporter votre aide