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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    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 Expert Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    D�tails du profil
    Informations personnelles :
    �ge : 49
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    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 Expert Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    D�tails du profil
    Informations personnelles :
    �ge : 49
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    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