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++ Discussion :

loader en c++ une dll build�e en C#


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair�
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    216
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 216
    Par d�faut loader en c++ une dll build�e en C#
    Bonjour,

    Je cherche � utiliser une fonction d'une dll (build�e en C#) en c++. Voici la fonction en C#

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    namespace WMIString
    {
        public class WMI
        {
            public string GetString()
            {
                string maString= "";
                //...
                return maString;
            }
        }
    }
    Dans les propri�t�s du projet, j'ai mis sous l'onglet applications : target framework : ".NET Framework 2". Sous assembly information, j'ai coch� "Make assembly COM-visible"
    Dans les build options, j'ai coch�, "register for COM interop". Je devrais donc pouvoir utiliser cette dll dans un autre language, non?
    J'ai ensuite builder la dll (appelons la madll.dll) sans erreur

    Je veux ensuite charger cette dll depuis un projet c++ (j'utilise Qt �galement). Pour cela j'ai d�fini dans mon .h

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    typedef std::string (WINAPIV *WMI_GETSTRING)(VOID);
    et dans mon .cpp je fais
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    HINSTANCE hdll;
    hdll = LoadLibraryW( L"madll.dll" );
    if(hdll) 
    	ui.textEdit->append("madll.dll loaded");
    else
    	ui.textEdit->append("madll.dll not loaded");
     
    WMI_GETSTRING WMIGetString;
    WMIGetString= (WMI_GETSTRING)GetProcAddress( hdll, "GetString");
    if( !WMIGetString)
           ui.textEdit->append("cannot find function");
    Cela compile, et je peux voir que la dll est bien charg�e correctement (le message "madll.dll loaded" s'affiche), cependant la fonction n'est pas trouv�e.

    Pourquoi?
    Merci d'avance pour votre aide

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    D�tails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par d�faut
    Est-ce que tu as aussi essay� avec la directive #import ? C'est souvent plus simple.

    Edit : Et puis m�me, si je me souviens bien, on ne peut pas faire des GetProcAddress comme �a avec COM. Il faut plut�t faire qqchose comme :
    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
     
    #import "madll.dll"
    void foo()
    {
       CoComPtr<IWMI> wmi;
       wmi.CoCreateInstance(/* on passe ici le guid de l'objet com */);
     
       BSTR s = wmi->GetString();
    } // release automatique de wmi quand on sort de la portée de foo
     
    int main()
    {
       CoInitialize();
       foo();
       CoUnitialize();
    }

  3. #3
    Membre �clair�
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    216
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 216
    Par d�faut
    Merci pour ta r�ponse Arzar,

    Elle m'a permis de trouver un tr�s bon article nomm� "how-to-call-a-managed-dll-from-unmanaged-code"

    Voici les principales �tapes
    1. Impl�menter et builder la dll C# (class library)
    2. g�n�rer un fichier clef � l'aide de la commande
    sn.exe -k MyKeyFile.SNK
    3. Ajoute/modifier les lignes suivantes du fichier AssemblyInfo.cs
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    [assembly: ComVisible(true)]
    [assembly: AssemblyDelaySign(false)]
    [assembly: AssemblyKeyFile("MyKeyFile.SNK")]
    4. g�n�rer un fichier .tlb � l'aide de la commande
    RegAsm.exe [including full path] madll.dll /tlb:madll.tlb /codebase
    5. on peut ensuite utiliser cette dll depuis du code C++ avec
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    // Import the type library in DLL
    #import "madll.tlb" raw_interfaces_only
    Salutations

  4. #4
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

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

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    A noter qu'en faisant ainsi, tu cr�es un wrapper COM autour de ta DLL. Ce n'est pas le seul moyen de faire. En effet, tu peux inclure mscoree.h et importer mscorelib.tlb, tu auras ainsi acc�s � un wrapper com autour du noyau de la CLR, et � partir de ce wrappper tu pourras appeler CorBindToRuntimeEx pour acc�der � la clr, et � partir de l�, des fonction comme ExecuteInDefaultAppDomain peuvent demander � la CLR de charger une DLL manag�e sp�cifique.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  5. #5
    Membre habitu�
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    13
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Par d�faut
    Bonjour,

    Voici mon probl�me,

    J'ai une DLL en c# compil�e avec VS 2010. Je souhaiterais pouvoir l'utiliser depuis du code natif c++ (comme d�crit pr�c�demment), mais depuis VS 2005.

    J'ai essayer de plusieurs mani�re notamment celle ci qui va cr�er un wrapper C++ sur ma DLL.

    Code de la DLL dllTest.dll (c# VS2010)
    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
     
    using System;
     
    namespace NamespaceDLL
    {
      public class MaDll
      {
        ...
        public static int SimpleTest(int value)
        {
          return ++value;
        }
        ...
      }
    }
    Code du Wrapper wrapper.cpp (C++ VS2010)
    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
     
    #include "stdafx.h"
    #include "wrapperDll.h"
     
     
    #using "..\bin\Debug\dllTest.dll"
     
    using namespace System;
    using namespace NamespaceDLL;
     
    extern "C"
    {
    	__declspec(dllexport) int __cdecl SimpleTest (int value)
    	{
    		MaDll __gc *test;
    		test = new MaDll;
     
    		return test->SimpleTest (value);
    	}
    }
    Application Test natif test.cpp (WIN32 App consol VS2005)
    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
     
    #include "stdafx.h"
     
    using namespace std;
     
    extern "C"
    {
    	int __cdecl SimpleTest(int value);
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {	
      SimpleTest(100);
     
      return 0;
    }
    Voil� le gros du code. Tous les fichiers sont pr�sents DLL LIB car pas de probl�me de compilation. Mais � l'ex�cution il y a une erreur lors de l'appel de la m�thode du wrapper qui fait appel � celle de la DLL.

    Quand j'ex�cute ce que test depuis VS2010 je n'ai aucun probl�me et j'obtiens le r�sultat attendu. Mais via VS2005 erreur ...

    Si vous pouvez m'aider ... Merci.

    Saris

  6. #6
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    Par d�faut
    C'est quoi comme erreur ?

    Ciblez-vous bien le Framework 2.0 de .Net dans les projets C# et C++/CLI ?

    VS2005-> Framework 2.0

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 4
    Dernier message: 18/02/2015, 14h26
  2. R�ponses: 9
    Dernier message: 28/01/2014, 22h43
  3. Utilisation d'une dll �crite en delphi 5 dans VB6
    Par Jean-Louis dans le forum Langage
    R�ponses: 4
    Dernier message: 05/08/2002, 09h19
  4. Declarer une dll Delphi ?
    Par DelphiCool dans le forum C++Builder
    R�ponses: 2
    Dernier message: 26/07/2002, 10h07
  5. Equivalent � ExeName pour une DLL
    Par Smortex dans le forum Langage
    R�ponses: 7
    Dernier message: 16/07/2002, 21h07

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