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
- [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 dans
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