Bonjour collègues développeurs,
Je suis en train de migrer l'interface d'une application C/C++ vers une technologie ASP.NET
Malheureusement je me retrouve confronté à un problème bloquant. J'aurais donc besoin de vos lanternes
Le contexte :
L'application est aujourd'hui fonctionnel en client lourd, et tourne avec des "Winforms". L'objectif et de transformer l'application en Dll(s) et d'utiliser ces Dlls dans un projet ASP.Net.
De cette facon, on réutilise les fonctions existantes et on ne recréé que le coté graphique web.
Mon avancement :
Le coté metier, c'est à dire les fonctions de calcule de l'application sont sous form de Dll, avec une prise en charge COM.
Pour effectuer des tests, seul quelques dlls ont été créées.
Une nouvelle solution sous visual studio 8 a été créé. Celle-ci comprend :
- Un projet ASP.Net créer via l'assitant sur un model MVC.
- Un projet dll comprenant mon code générant ma dll (code c/c++ comprenand des header file, des definition de structures).
Dans le header du projet dll on trouve :
- La definition d'une structure PERSONNE
- Le code permettant l'appel externe d'une fonction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 typedef struct PERSONNE{ int age; int nbrEnfants; }PERSONNE;
Dans le fichier cpp on trouve :
Code : Sélectionner tout - Visualiser dans une fenêtre à part extern "C" __declspec(dllexport) int __stdcall getAge(PERSONNE p);
Dans le projet ASP on trouve dans le home controler :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int __stdcall getAge(PERSONNE p) { return p.age; }
et dans le fonction index :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 [DllImport("Access_dll.dll", EntryPoint="getAge", CharSet=CharSet.Auto)] public static extern int getAge([In, MarshalAs(UnmanagedType.LPStruct)] PERSONNE p);
La compilation me génére le fichier dll, ajouté comme référence au projet ASP.net. Cette référence fait bien apparaitre la fonction getAge dans l'explorateur d'objet.
Code : Sélectionner tout - Visualiser dans une fenêtre à part int age = getAge(???); // ??? car je ne vois pas comment récupérer ma structure PERSONNE pour l'instancier.
Ce que je parvient à faire :
L'appel de fonction présent dans ma dll qui prend en paramètre des parametres de type courant (comme int, string, ...) fonctionne sans problème. J'affiche sur la page web le résultat d'une fonction présente dans ma dll. Pour faire ce teste, je redefinit ma fonction getAge avec un entier en paramètre, et je lui demande de me retourner cette entier. Dans ce cas tout ce passe correctement
Le problème :
Je ne sais pas comment appeller une fonction avec un parametre autre qu'un type simple.
En effet, cela semble logique, je ne peux pas "importer" de header en asp.net, et donc le projet asp ne connait pas la structure personne.
Solution envisagée :
J'ai bien essayer de créer un class PERSONNE avec les mêmes attributs que ceux de la structure mais l'appel à la fonction echoue. L'objet de type PERSONNE et la structure PERSONNE ne sont pas reconnu comme étant la même, se qui peut être comprehensible.
Erreur retournée :class PERSONNE créé dans le projet ASP:Impossible de trouver le point d'entrée 'getAge' dans la DLL 'MyDll.dll'. //MyDll.dll étant la dll contenant la fonction getAge.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 [StructLayout(LayoutKind.Sequential)] public class PERSONNE { public int age; public int nbrEnfants; }
Quelqu'un aurait-il une piste ?
Me suis-je planté quelque part dans mon raisonnement ?
Suis-je assez clair ? ^^
J'espere que vous pourrez m'éclairer. Quoi qu'il en soit merci de m'avoir lu![]()
Partager