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 :

Problème d'export de fonctions depuis une dll développée en C#


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Informatique Senior
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Informatique Senior

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 65
    Points
    65
    Par défaut Problème d'export de fonctions depuis une dll développée en C#
    Bonjour,

    Est-il possible d'appeler des fonctions d'une dll développée en C# en utilisant les APIs LoadLibrary et GetProcAddress?

    J'ai le code suivant :
    -------------------Code-------------------------------
    Code c# : 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
    50
    namespace mcClientWithoutAddReference
    {
        static class NativeMethods
        {
            [DllImport("kernel32.dll")]
            public static extern IntPtr LoadLibrary(string dllToLoad);
     
            [DllImport("kernel32.dll")]
            public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
     
            [DllImport("kernel32.dll")]
            public static extern bool FreeLibrary(IntPtr hModule);
        }
     
        class Program
        {
     
            [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
            private delegate int mcTestMethod(int d);
     
            static void Main(string[] args)
            {
     
                IntPtr pDll = NativeMethods.LoadLibrary(@"C:\\mcMath.dll");
     
                //oh dear, error handling here
                if (pDll == IntPtr.Zero)
                {
                    Console.WriteLine("Pointer DLL null");
                }
     
                IntPtr pAddressOfFunctionToCall = NativeMethods.GetProcAddress(pDll, "mcTestMethod");
     
                //oh dear, error handling here
                if (pAddressOfFunctionToCall == IntPtr.Zero)
                {
                    Console.WriteLine("Adress null");
                }
     
                mcTestMethod addResult = (mcTestMethod)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall, typeof(mcTestMethod));
     
                int theResult = addResult(10);
     
                bool result = NativeMethods.FreeLibrary(pDll);
     
                Console.WriteLine(theResult.ToString());
                int f = 0;
            }
        }
    }
    -------------------------------------------------------

    Le problème est :
    1- L'appel à GetProcAddress retourne toujours 0 malgré que l'appel à LoadLibrary réussit et que le nom de la fonction à appeler "mcTestMethod" existe correctement dans la dll.
    2- J'ai développé une autre dll identique à celle développée en C# mais en C++. Dans ce cas, l'appel à GetProcAddress réussit et la méthode "mcTestMethod" est exécutée correctement.


    Des explications svp.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 173
    Points : 25 113
    Points
    25 113
    Par défaut
    je ne pense pas
    si tu veux faire un appel depuis .net tu peux passer par la reflection (loadassembly, puis gettypes, puis getmethod, puis invoke)

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Informatique Senior
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Informatique Senior

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 65
    Points
    65
    Par défaut
    Bonjour,

    Je ne suis pas très familier avec la notion de "reflection".
    J'essairais de googler un peu pour voir est-ce que cela correspond à mes besoins.
    Tout ce que j'ai besoin de faire c'est de développer une .dll en C# dont les méthodes pourront être appelées par une application console développée elle aussi en C#.

    Je suis en train d'explorer 2 pistes :
    1- Soit développer une dll intérmédiare en C++ qui sera appelée par l'appli console C# (Ce que j'ai réussi à faire comme décrit dans mon post précédent). Cette dll C++ appellera à son tour la dll C#.

    2- Explorer les outils ildasm.exe et ilasm.exe. Le but c'est :
    - De générer le code IL de ma dll C# à l'aide de ildasm.exe.
    - Modifier le code IL pour rendre ma méthode "mcTestMethod" exportable (Reste à savoir si c'est possible...).
    - Regénérer de nouveau la dll C# à l'aide de ilasm.exe.


    Des idées???

  4. #4
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Citation Envoyé par ali.ensi Voir le message
    Tout ce que j'ai besoin de faire c'est de développer une .dll en C# dont les méthodes pourront être appelées par une application console développée elle aussi en C#.
    Si tu as la dll au moment de la compilation il suffit de l'ajouter aux références du projet. Les méthodes devront bien évidemment être publique.
    Si tu ne l'a pas à ce moment là il faut utiliser la reflection comme l'a dit Pol63.

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 173
    Points : 25 113
    Points
    25 113
    Par défaut
    @ali.ensi c'est vraiment tordu d'imaginer des trucs aussi étranges !

    si tu as une dll tu fais ajouter en référence et tu peux alors appeler tout ce qui est public dedans comme si c'était dans ton projet

    sinon la reflection permet de manipuler des choses qu'on ne connait pas lors du développement et/ou des choses non public

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Informatique Senior
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Informatique Senior

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 65
    Points
    65
    Par défaut
    @ meziantou:
    Oui, j'ai testé cette méthode (Ajout de la dll comme référence) et ça a fonctionné. Mais, "j'apprécie" plus l'utilisation des APIs LoadLibrary et GetProcAddress comme je l'ai fait pour appeler la dll C++.

    J'analyserais un peu la réflection pour voir...
    Sinon si ça ne mène à rien, j'ajouterai la dll comme référence....

    Merci à vous deux.

  7. #7
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Citation Envoyé par ali.ensi Voir le message
    "j'apprécie" plus l'utilisation des APIs LoadLibrary et GetProcAddress comme je l'ai fait pour appeler la dll C++.
    Qu'est-ce que tu trouve de mieux à cette méthode ?

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur Informatique Senior
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Informatique Senior

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 65
    Points
    65
    Par défaut
    Je la trouve plus élégante.
    Je n'ai que charger la dll, ensuite j'appelle la méthode désirée par son nom. Nul besoin d'ajouter des références aux projet en cours.
    Imagine si j'ai besoin d'une centaine de dll. J'aurais 100 références à ajouter au projet...

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur Informatique Senior
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Informatique Senior

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 65
    Points
    65
    Par défaut
    Pol63, j'ai essayé la réflection avec (loadassembly, puis gettypes, puis getmethod, puis invoke) et ça semble fonctionner .

    Voici le tutoriel que j'ai suivi :
    http://www.csharp-examples.net/reflection-examples/

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

Discussions similaires

  1. Problème d'appel de fonction d'une dll
    Par Daemon80 dans le forum Langage
    Réponses: 0
    Dernier message: 25/05/2012, 11h23
  2. Exporter des widgets depuis une DLL
    Par zebiloute dans le forum wxWidgets
    Réponses: 5
    Dernier message: 31/07/2006, 08h14
  3. Réponses: 18
    Dernier message: 24/05/2006, 17h04
  4. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30
  5. Réponses: 4
    Dernier message: 01/07/2004, 11h53

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