juin
2007
Beaucoup de bibliothèques C utilisent des structures pour regrouper des données sémantiquement.
Nous allons voir ici comment réutiliser des structures d’une bibliothèque C en C# avec DllImport.
Tout d’abord, créons une bibliothèque C : (nouveau projet WIN32, application type dll, empty project).
Créons un nouveau fichier .cpp et créons une structure simple :
int telfixe;
int telPort;
} MASTRUCTURETEL;
Et ensuite créons une fonction qui retourne un pointeur sur une structure remplie, n’oublions pas l’exportation et le extern C pour éviter la décoration de la fonction.
{
MASTRUCTURETEL *maStruct = new MASTRUCTURETEL;
maStruct->telfixe = 123;
maStruct->telPort = 456;
return maStruct;
}
Le compilateur nous génère un .lib et un .dll
Créons maintenant un projet C# qui va utiliser cette dll :
Tout d’abord on a besoin du namespace System.Runtime.InteropServices pour utiliser DllImport : 
Pour mapper la structure maintenant, on va créer une classe :
public class MaStructTelCSharp
{
public Int32 telFixe;
public Int32 telMobile;
}
Pour mapper un entier, on utilise bien sûr un Int32.
Pour mapper correctement la structure, On va avoir besoin de préciser l’attribut StructLayout à Sequential pour préserver l’alignement mémoire.
Exportons ensuite la fonction :
public static extern IntPtr GetUneStructure();
Dans le main, maintenant, appelons cette fonction et récupérons un pointeur natif vers notre structure :
IntPtr maStructureCUnmanaged = GetUneStructure();
Puis marshallons ces données vers notre classe « structure » créé pour l’occasion grâce à Marshal.PtrToStructure :
Marshal.PtrToStructure(maStructureCUnmanaged, maStructureCSharp);
Maintenant, on peut utiliser la structure pour afficher les informations par exemple :
Console.WriteLine(maStructreCSharp.telMobile);
N’oubliez pas de copier le fichier dll dans le répertoire debug du projet C#
Executez, on récupère bien les informations.
Voilà pour ce cas d’interopérabilité simple
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)