La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Appels de fonctions natives sous C# Proposition dune architecture pour « wrapper » une classe native.

Présentations similaires


Présentation au sujet: "Appels de fonctions natives sous C# Proposition dune architecture pour « wrapper » une classe native."— Transcription de la présentation:

1 Appels de fonctions natives sous C# Proposition dune architecture pour « wrapper » une classe native

2 Managed code vs Unmanaged code C++ (compilation, décoration, exportation) Fonctionnalités « interops » de.NET Architecture proposée Création des 4 projets Déploiement

3 Managed Code vs Unmanaged code Managed code : code exécuter (interpréter) sous le « framework ».NET.

4 Sous.NET CF 2.0, il ny a pas de C++/CLI Managed Code vs Unmanaged code

5 C++: Compilation Lors de la compilation, le compilateur génère un fichier.obj par fichier.cpp quil compile. Toutes les fonctions et variables globales compilées dans un fichier.obj sont « marquées ». Lors de lapplication des liens, le « Linker » génère un fichier « PE » en liant tous les fichiers.obj.

6 C++: Décoration La déclaration dune fonction dans un fichier.obj est encodée (décorée). Lalgorithme de décoration dépend du compilateur (et parfois aussi de sa version). En C, il ny a habituellement pas de décoration.

7 C++: Décoration Exemple: soit la variable globale « int dllVersion ». Son nom décoré sera « » sous Visual C Pour déclarer, sous C++, une entité non décorée; il faut forcer le compilateur à linterpréter comme du code C: extern C int dllVersion;

8 C++: Exportation Pour exporter une variable globale ou fonction, sa déclaration doit être ajoutée dans la table dexportation du fichier « PE ». « __declspec(dllexport) » le fait automatiquement.

9 C++: Exportation

10 Pour exporter une fonction non décorée: extern C __declspec(dllexport) void fnt(int);

11 Fonctionnalités « Interops » de.NET P/invoke permet, sous.NET, dexécuter du code natif (unmanaged). Sous CF 2.0, la convention dappel est __cdecl [DllImport("CommandCInterface.dll", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode, EntryPoint = "SetNameAgeCommand_SetNameAgeCommand_name_age")] internal static extern IntPtr SetNameAgeCommand_SetNameAgeCommand_name_age(byte[] name, Int32 age);

12 Architecture proposée : buts Pouvoir simplement importer une classe sous C# qui fut implémentée sous C++ (unmanaged). Apporter très peu de modifications au projet à importer. Compréhensible et possiblement automatisable. Simple à déployer.

13 Architecture proposée : Modèle

14 Architecture proposée: projet « Command.dll » Est un projet C++ unmanaged code. Est le projet original à importer sous.NET Nécessite très peu (ou pas du tout de modification).

15 Architecture proposée: CommandCInterface.dll Est un projet C++ unmanaged code. Est une interface C de la classe Command. Pour chaque fonction membre de la classe « Command », il faut exporter une fonction « wrapper » Il faut ajouter une référence au projet Command.dll Exemple: extern "C" __declspec(dllexport) void SetNameAgeCommand_EncodeCommand(SetNameAgeCommand *this_);

16 Architecture proposée: CommandCSInterface.dll Est un projet C#. Est une interface C# de la classe Command. Pour chacune des fonctions exportées de CommandCInterface.dll, il faut ajouter une fonction statique de type p/invoke. Il faut ajouter une dépendance au projet CommandCInterface.dll.

17 Architecture proposée: CommandCSInterface.dll La classe interface doit encapsuler un pointeur « protected IntPtr this_; » sur lobjet « Command ». Il doit être passé en paramètre lors de lappel dune fonction. « this_ » est initialisé lors de la création dune instance. « this_ » est détruit lors de la destruction de linstance.

18 Architecture proposée: CommandCSInterface.dll [DllImport("CommandCInterface.dll", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode, EntryPoint = "SetNameAgeCommand_EncodeCommand")] private static extern void SetNameAgeCommand_EncodeCommand(IntPtr p);

19 Architecture proposée: DeviceApp.exe Est un projet C# Utilise linterface C# pour accéder à un objet de type « Command ». Il faut ajouter une référence au projet CommandCSInterface.dll.

20 Création du projet Command.dll C++, librairie pour Windows Mobile Device 5.0. Réutiliser les mêmes fichiers utilisés pour compiler le projet sous Win32. Sassurer dêtre en « Unicode ».

21 Création du projet: CommandCInterface.dll C++, librairie pour Windows Mobile Device 5.0. Sassurer dêtre en « Unicode ». Ne pas oublier la référence sur Command.dll

22 Création du projet: CommandCSInterface.dll C#, librairie 2.0 pour Windows Mobile Device 5.0. Ne pas oublier la dépendance sur CommandCInterface.dll.

23 Création du projet: DeviceApp.exe C# application graphique 2.0 pour Windows Mobile Device 5.0. Ne pas oublier la référence sur CommandCSInterface.dll.

24 Déploiement Il est important dajuster les propriétés des 4 projets concernant leur déploiement. Tous les projets doivent être déployés dans le même répertoire!

25 Questions…


Télécharger ppt "Appels de fonctions natives sous C# Proposition dune architecture pour « wrapper » une classe native."

Présentations similaires


Annonces Google