juin
2007
On vient de me poser une question :
je veux utiliser cette structure en C dans mon programme C#
{
int val;
int telfixe[10][2];
} MASTRUCTURETEL;
j’ai un peu modifié l’exemple pour que ce soit plus simple, mais la question porte sur le tableau à deux dimensions.
Alors, comment faire ?
Sur l’exemple de mes précédents billets, je vais créer une dll qui va exporter une fonction qui me retourne une structure :
{
int val;
int telfixe[10][2];
} MASTRUCTURETEL;
extern "C" __declspec(dllexport) MASTRUCTURETEL * GetUneStructure()
{
MASTRUCTURETEL *maStruct = new MASTRUCTURETEL;
for (int i = 0 ; i < 10 ; i++)
for (int j = 0; j < 2 ; j++)
maStruct->telfixe[i][j] = (i+1)*(j+1);
maStruct->val = 10;
return maStruct;
}
J’initialise mon tableau avec un peu n’importe quoi, mais bon voila, c’est exactement le tableau que je voulais avec les valeurs que je voulais :p
Maintenant, je veux pouvoir l’utiliser dans mon programme C#.
Il faut savoir que le marshaleur ne sait pas marshaler des tableaux multi-dimmensionnels, et donc que fatalement, nous allons récupérer un tableau à une seule dimension. Pour ce faire, on crée la structure C# ainsi :
public class MaStructTelCSharp
{
public int val;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=10*2, ArraySubType=UnmanagedType.SysInt)]
public int[] telFixe;
}
L’important est de noter la taille du tableau dans le paramètre SizeConst de l’attribut MarshalAs. On lui précise aussi qu’on veut récupérer des entiers.
Puis, on récupère la structure ainsi :
public static extern IntPtr GetUneStructure();
...
IntPtr maStructureCUnmanaged = GetUneStructure();
MaStructTelCSharp maStructureCSharp = new MaStructTelCSharp();
Marshal.PtrToStructure(maStructureCUnmanaged, maStructureCSharp);
Au final donc, on se retrouve avec une structure qui contient un tableau à une dimension au lieu d’un tableau à deux dimensions.
C’est triste mais c’est ainsi.
Rien ne vous empeche de reconstruire éventuellement un tableau à deux dimensions à partir de notre tableau à 1 dimension.
1 Commentaire + Ajouter un commentaire
Commentaires récents
- dans [Tests] Arrange Act Assert, une traduction ?
 - dans [UnitTest][C#] Tester une méthode privée
 - dans Récupérer une valeur d’un contrôle depuis une autre Form / inclusions croisées et déclaration anticipée
 - dans Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight
 - dans Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight
 
Archives
- janvier 2013
 - avril 2012
 - janvier 2012
 - juin 2011
 - janvier 2011
 - décembre 2010
 - novembre 2010
 - septembre 2010
 - juin 2010
 - mars 2010
 - février 2010
 - janvier 2010
 - décembre 2009
 - novembre 2009
 - octobre 2009
 - septembre 2009
 - août 2009
 - juillet 2009
 - mai 2009
 - avril 2009
 - mars 2009
 - janvier 2009
 - décembre 2008
 - novembre 2008
 - octobre 2008
 - septembre 2008
 - août 2008
 - juillet 2008
 - juin 2008
 - mai 2008
 - avril 2008
 - mars 2008
 - février 2008
 - janvier 2008
 - décembre 2007
 - novembre 2007
 - octobre 2007
 - septembre 2007
 - août 2007
 - juillet 2007
 - juin 2007
 - mai 2007
 

 Un article de nico-pyright(c)   
					
 
Un grand Merci à Nico-Pyright(c) pour ce blog qui m’a permis d’interfacer ma Dll en C avec du C#.
Pour completer la convertion des types pour un tableau de char :
En C:
typedef struct
{
int val;
char telfixe[10];
} MASTRUCTURETEL;
En C# la classe correspondante :
public class AdresseIn
{
public Int32 val;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=10)]
public string telfixe;
}
Ensuite reste juste à suivre les instructions de Nico-Pyright(c)
Ayant eu des problèmes avec cette convertion, je tenais à vous en faire part…
@+ et encore merci pour ce blog…