IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Utilisation d'une dll c dans du code ASP.Net / problème avec les structures


Sujet :

ASP.NET

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Utilisation d'une dll c dans du code ASP.Net / problème avec les structures
    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

  2. #2
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    Si je comprends bien ton souci c'est d'accéder aux objets de ta dll dans ton application ASP.net?

    Ceci est ton objet personne pour ta dll:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct PERSONNE{
    	int age;
    	int nbrEnfants;
    }PERSONNE;
    Il faut que tu puisses y accéder depuis ta page asp.net. Si tu as une page avec du code behind, tente le using de ton namespace et essaye de créer une simple personne mais sans y faire quoi que ce soit. Si tu travailles directement dans ta page ASP alors regarde du coté de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ Import Namespace="MonNAmespace" %>
    à placer en haut de ta page.

    n'hésites pas a nous tenir au courant de la suite, bon courage à toi.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci de t'être penché sur le problème Arthis. Cependant, je viens juste de trouver la solution que je vais détailler pour que tout le monde puisse en profiter. Vous pourrez constater que j'été tout prêt de la solution

    Le principe :
    Pour pouvoir dialoguer avec une structure définit en C++ dans du code C#, il faut :
    - Créer une methode en C++ qui retourne un structure initialiser
    - Créer cette même structure en C# (ce qui avait été fait)
    - Mapper les deux entitées avec la classe Marshal

    En detail il faut :
    Dans le fichier Cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int __stdcall getAge(PERSONNE * p)
    {
    	return p->age;
    }
    PERSONNE * getPersonneStruct() 
    { 
      PERSONNE *maStruct = new PERSONNE; 
      maStruct->age = 27; 
      maStruct->nbrEnfants = 1; 
      return maStruct; 
    }
    Vous remarquerez que la fonction getAge prend en parametre un pointer, et non plus la structure directement !

    Dans le fichier header du cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct PERSONNE{
    	int age;
    	int nbrEnfants;
    }PERSONNE;
     
    extern "C" __declspec(dllexport) PERSONNE * getPersonneStruct();
    extern "C" __declspec(dllexport) int __stdcall getAge(PERSONNE * p);
    Voila pour les fichiers de la dll.

    Pour ce qui est du projet ASP.Net

    Dans le homeContoller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    using System;
    using System.Runtime.InteropServices;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
     
    namespace MvcApplication1.Controllers
    {
        [HandleError]
        public class HomeController : Controller
        {
            [DllImport("MyDll.dll")]
            public static extern IntPtr getPersonneStruct();
     
            [DllImport("MyDll.dll")]
            public static extern int getAge(IntPtr personne);
     
            public ActionResult Index()
            {
                IntPtr personneCpp = getPersonneStruct();
                PERSONNE pcSharp = new PERSONNE();
     
                // On récupère dans pcSharp les données de la structure C++
                Marshal.PtrToStructure(personneCpp, pcSharp);
     
                //On modifie les donné de notre class C#
                pcSharp.age = 5;
     
                //On applique ces changements à la structure C++
                Marshal.StructureToPtr(pcSharp, personneCpp, true);
     
                //On peut maintenant appeler la fonction getAge avec le pointeur de structure !!!
                int AgeStructCpp = getAge(personneCpp);
     
                ViewData["Message"] = "Resultat : "+ AgeStructCpp;
                return View();
            }
    La classe Personne n'a pas changé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    using System;
    using System.Runtime.InteropServices;
     
    [StructLayout(LayoutKind.Sequential)]
    public class PERSONNE
    {
        public int age;
        public int nbrEnfants;
    }
    Source d'aide pour résoudre mon problème :
    http://blog.developpez.com/nico-pyri...tilisation-de/

    Merci à developpez.com !!!

    Si vous trouvez plus simple n'hesitez pas à poster

  4. #4
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    Bon j'étais loin de tout dans ma réponse, mais comme on dit, c'est l'intention qui compte!

    a++

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Exactement !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation d'une dll C# dans du code C++ ?
    Par Selven dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 15/04/2013, 23h09
  2. [MEX] utiliser une dll C dans le code matlab
    Par hector2 dans le forum MATLAB
    Réponses: 2
    Dernier message: 18/06/2010, 15h53
  3. utilisation d'une fonction ailleur dans le code
    Par tortuegenie dans le forum ASP.NET
    Réponses: 2
    Dernier message: 20/11/2008, 11h07
  4. Utilisation d'une Dll c# dans un projet c,c++
    Par hunter69fr2002 dans le forum C#
    Réponses: 2
    Dernier message: 07/02/2008, 16h20
  5. Réponses: 7
    Dernier message: 05/01/2008, 19h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo