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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
typedef struct PERSONNE{
	int age;
	int nbrEnfants;
}PERSONNE;
- Le code permettant l'appel externe d'une fonction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
extern "C" __declspec(dllexport) int __stdcall getAge(PERSONNE p);
Dans le fichier cpp on trouve :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
int __stdcall getAge(PERSONNE p)
{
	return p.age;
}
Dans le projet ASP on trouve dans le home controler :
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);
et dans le fonction index :
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.
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.

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 :
Impossible de trouver le point d'entrée 'getAge' dans la DLL 'MyDll.dll'. //MyDll.dll étant la dll contenant la fonction getAge.
class PERSONNE créé dans le projet ASP:
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