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

C++/CLI Discussion :

Utilisation d'une lib de code managé dans dll


Sujet :

C++/CLI

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Utilisation d'une lib de code managé dans dll
    Bonjour,

    Débutant en C++ et .NET, je teste actuellement le fonctionnement des dll et donc le paramétrage nécessaire afin d'exporter des fonctions et de les importers pour un executable.

    J'ai donc repris l'exemple donné par MSDN, jusque là tout va bien, le code est natif tout fonctionne comme il faut.

    J'ai donc essayé d'intégrer du code managé dans ma dll : une simple messagebox.

    La dll compile tout va bien, mais lorsque je compile le programme utilisant la dll (le programme est en c++ natif) j'obtiens en résultat les erreurs suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    2>MyExecRefsDll.obj : error LNK2019: symbole externe non résolu "public: static void __cdecl MathFuncs::MyMathFuncs::affiche(void)" (?affiche@MyMathFuncs@MathFuncs@@SAXXZ) référencé dans la fonction _main
    2>MyExecRefsDll.obj : error LNK2019: symbole externe non résolu "public: static double __cdecl MathFuncs::MyMathFuncs::Divide(double,double)" (?Divide@MyMathFuncs@MathFuncs@@SANNN@Z) référencé dans la fonction _main
     
    2>MyExecRefsDll.obj : error LNK2019: symbole externe non résolu "public: static double __cdecl MathFuncs::MyMathFuncs::Multiply(double,double)" (?Multiply@MyMathFuncs@MathFuncs@@SANNN@Z) référencé dans la fonction _main
     
    2>MyExecRefsDll.obj : error LNK2019: symbole externe non résolu "public: static double __cdecl MathFuncs::MyMathFuncs::Subtract(double,double)" (?Subtract@MyMathFuncs@MathFuncs@@SANNN@Z) référencé dans la fonction _main
     
    2>MyExecRefsDll.obj : error LNK2019: symbole externe non résolu "public: static double __cdecl MathFuncs::MyMathFuncs::Add(double,double)" (?Add@MyMathFuncs@MathFuncs@@SANNN@Z) référencé dans la fonction _main
    Sachant que si j'active la prise en charge du CLR dans l'appli, j'ai en plus des erreurs LNK2028 sur les mêmes lignes.

    Ci dessous le code de l’exécutable utilisant la dll:

    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
     
    // MyExecRefsDll.cpp
    // compile with: /EHsc /link MathFuncsDll.lib
     
    #include <iostream>
    #include "MathFuncsDll.h"
    using namespace std;
    using namespace MathFuncs;
     
    int main()
    {
        double a = 7.4;
        int b = 99;
     
        cout << "a + b = " <<
            MathFuncs::MyMathFuncs::Add(a, b) << endl;
        cout << "a - b = " <<
            MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
        cout << "a * b = " <<
            MathFuncs::MyMathFuncs::Multiply(a, b) << endl;
        cout << "a / b = " <<
            MathFuncs::MyMathFuncs::Divide(a, b) << endl;
     
    	MathFuncs::MyMathFuncs::affiche();
     
        return 0;
    }
    Le header de la dll:

    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
     
    // MathFuncsDll.h
     
    namespace MathFuncs
    {
        class MyMathFuncs
        {
        public:
            // Returns a + b
            static __declspec(dllexport) double Add(double a, double b);
     
            // Returns a - b
            static __declspec(dllexport) double Subtract(double a, double b);
     
            // Returns a * b
            static __declspec(dllexport) double Multiply(double a, double b);
     
            // Returns a / b
            // Throws DivideByZeroException if b is 0
            static __declspec(dllexport) double Divide(double a, double b);
     
    		//test affichage messagebox
    		static __declspec(dllexport) void affiche();
        };
    }
    et le code source de la dll:

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    // MathFuncsDll.cpp
    // compile with: /EHsc /LD
     
    #include "MathFuncsDll.h"
     
    #include <stdexcept>
    #include <Windows.h>
    #using <mscorlib.dll> 
    using namespace System;
    using namespace std;
     
    namespace MathFuncs
    {
        double MyMathFuncs::Add(double a, double b)
        {
            return a + b;
        }
     
        double MyMathFuncs::Subtract(double a, double b)
        {
            return a - b;
        }
     
        double MyMathFuncs::Multiply(double a, double b)
        {
            return a * b;
        }
     
        double MyMathFuncs::Divide(double a, double b)
        {
            if (b == 0)
            {
                throw new invalid_argument("b cannot be zero!");
            }
     
            return a / b;
        }
     
    	void MyMathFuncs::affiche()
    	{
     
    		/*#pragma push_macro("MessageBox")
    		#undef MessageBox*/
    			System::Windows::Forms::MessageBox::Show("Message");
    		/*#pragma pop_macro("MessageBox")*/
     
    	}
    }
    Ma question est donc, qu'ai-je fait de mal?

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Attends, tu as un EXE natif utilisant une DLL managée? Normalement, ça ne peut pas se faire si facilement; il faut passer par COM ou bien hoster soi-même le runtime .Net...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Attends, tu as un EXE natif utilisant une DLL managée? Normalement, ça ne peut pas se faire si facilement; il faut passer par COM ou bien hoster soi-même le runtime .Net...
    Salut,

    Merci pour ta réponse.

    J'avais en effet le sentiment que cela était la cause de mon problème.

    Je vais donc me pencher sur COM. Pardonnes mon ignorance, mais peux tu me décrire le concept de "hoster soi-même le runtime .Net"?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    peux tu me décrire le concept de "hoster soi-même le runtime .Net"?
    Je n'y connais pas grand-chose non plus, mais il est question d'utiliser directement les fonctions de MSCOREE.DLL (qui d'ailleurs, sont elles aussi exposées via des interfaces COM d'après mes souvenirs).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    Tu souhaites utiliser une dll mélangeant natif/managé.

    Quand tu compiles ton programme natif qui utilise la dll, tu as des symboles externes non résolus.

    Je pense que le problème, c'est que tu compiles ta dll comme une librairie statique. En effet, lorsque l'on a des symboles externes non résolus, c'est parce que le compilateur essaie d'ajouter le code concerné. Lorsque l'on utilise une dll, le code est en dehors du programme qui l'utilise.

    Dans le code du programme qui utlilise la dll, tu dois charger cette dll et récupérer des pointeurs de fonction sur cette dll. C'est une façon de faire, en managé il y plusieurs façons de réaliser cela.

    PS: je me demande comment ta dll compile car je ne vois pas les "#pragma unmanaged".

  6. #6
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    BONJOUR Larxene

    Là j'ai comme l'impression que tu confonds 2 exemples (à cause du class qui porte le meme nom)

    Le 1er exemple MSDN ou :
    - le dll win32 est en natif c++
    - le projet console en natif...

    rubrique msdn Getting Started:
    Creating and Using a Dynamic Link Library (C++)
    Le 2eme exemple MSDN ou
    - le dll win32 est en managed c++/clr
    - le projet console en managed c++/clr

    rubrique msdn Getting Started:
    Creating and Using a Managed Assembly (C++)
    Médinoc:
    le "Hosting-Runtime" ou hebergement au runtime du CLR en natif:
    - chargement du CLR dans le process Win32 allouee à l'appli native c++ via interface ICorRuntimeHost (ICLRRuntimeHost) du CLR.Net 4.0...

    Des interfaces derivees de celleci (wrapper des interfaces .Net):
    - "defautAppDomain"
    - "defaultAppDomain" permet de charger l'Assembly.Net de l' user (AppDomain.LoadAssembly(name))..etc
    - Assembly permet d'obtenir un type et l'instancier....
    - le tableau auto-descriptible SafeArray est extennsivement utllise pour recuperer les resultats....en natif.

    le lien MSDN suivant en fournit un exemple (taper CLRHost) :
    http://http://www.google.fr/url?q=ht...wTOnA8htJr81Tw

    mais pour Larxene ce serait trop demande pour un debut....mais cela pourrait etre fait plus tard.....

    bon code....

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Merci pour vos réponses, j'ai pris note.

    J'ai l'impression que le problème est plus simple que ça. Je viens en effet d'essayer de compiler la dll et le programme l'utilisant en CLR, le résultat reste le même.

    Les erreurs sont causées par le fait que la dll soit compilée en CLR. Je ne sais pas pourquoi mais je vais chercher des informations concernant l'utilisation des dll sur les applications .NET.

Discussions similaires

  1. utilisation d'une lib open source dans un projet C++
    Par essalhi momed dans le forum Visual C++
    Réponses: 0
    Dernier message: 03/03/2010, 11h45
  2. Utilisation d'une lib C++ avec un code C.
    Par Letinono dans le forum Débuter
    Réponses: 1
    Dernier message: 30/11/2009, 16h16
  3. Intégré une zone de code HTML dans 1 page HTML sans Altéré le reste de la page
    Par sozik dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 08/04/2007, 10h38
  4. [Eclipse CDT] creer une lib et un executable dans le meme projet ?
    Par mamelouk dans le forum Eclipse C & C++
    Réponses: 4
    Dernier message: 28/11/2006, 15h05
  5. Réponses: 2
    Dernier message: 22/08/2006, 11h28

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