C# : Passer un pointeur sur un tableau de struct en param d'1 fonction d'1 dll native
Bonjour,
je dois implémenter une dll C++ native depuis un projet C#
Dans ma dll, j'ai cette structure :
Code:
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:
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:
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:
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:
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