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 :

VB .NET > C : comment utiliser une fonction d'une DLL .Net dans un programme C ?


Sujet :

C++/CLI

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut VB .NET > C : comment utiliser une fonction d'une DLL .Net dans un programme C ?
    Bonjour,

    J'aimerai connaitre la démarche pour pouvoir utiliser une fonction qui est dans une DLL VB.Net dans un programme écrit en C ?

    Exemple de la dll VB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Public
     
    Module myMod
     
    Function myFunc() AsInteger
     
    Return 1
     
    EndFunction
    End
     
    Module
    Exemple du code C que j'ai utilisé :

    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
     
    HINSTANCE hDLL; 
     
    // Handle to DLL
    LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
     
     
    hDLL = LoadLibrary("e:\\temp\\mydll.dll");
     
    if (hDLL != NULL)
    {
       lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"myFunc");
     
          if (!lpfnDllFunc1)
          {
                // Do the job ....
          }
     
       FreeLibrary(hDLL);
    }
    La DLL semble se charger et decharger correctement mais le pointeur de fonction est constamment nul. J'ai essayé avec des vairantes telles que :
    lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"myMod.myFunc");
    Mais rien n'y fait.

    Merci d'avance

    A+

    Male

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Réponse courte : c'est impossible, sauf si on passe par la création d'un composant COM
    Réponse longue : en fait, ni le VB.Net, ni le C# ne permettent d'exporter des fonctions à partir d'une dll. En revanche, l'IL le peut, mais on obtiens vite des trucs tordus car il faut décompiler la dll vers l'IL, la traiter, et la recompiler. Ca s'appelle de l'Inverse PInvoke (cherche sur google) et c'est loin d'être évident, cf ici.
    La deuxième méthode est de créer une dll en C++/CLI qui exportera les fonctions voulues et qui se chargera de faire correspondre les fonctions avec les objets .NET. C'est la méthode la plus simple à mettre en oeuvre à mon avis pour les petits et moyens projets. Si c'est très complexe, le passage par la création d'un composant COM pourrai simplifier les choses.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Solution partielle
    Bon après m'être acharné j'ai réussi à faire tourner le truc mais ça ne me convient pas à 100%.

    Premier problème de ma solution : ce n'est pas du C mais du C++
    Second problème la DLL est déclarée par regasm de manière statique je ne peux donc pas deployer facilement la solution (enfin si quelqu'un a une meilleure idée je suis preneur).

    Sur XP ça se passe bien en étant simple admin mais sur Vista faut carrément lever tous les verrous de l'admin.

    La procédure suivante est valable pour VS 2005.

    Tout d'abord créer la DLL en VB..; exemple de code pour le projet mydllname :
    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
    Public Interface myInterface
     
        Function Addition(ByVal Num1 As Integer, ByVal Num2 As Integer, ByRef Result As Integer) As Integer
     
    End Interface
     
    Public Class Class1
     
        Implements myInterface
     
        Function myFunc(ByVal Num1 As Integer, ByVal Num2 As Integer, ByRef Result As Integer) As Integer Implements myInterface.Addition
     
            Result = Num1 + Num2
     
            Return Result
     
        End Function
     
    End Class
    Aller dans les propriétés du projet et régler l'option rendre l'assembly visible par COM (onglet application > bouton informations de l'assembly)

    Aller ensuite dans l'onglet signature et signer l'assembly avec un nom fort.
    Ici : mydllname.snk

    Compiler la dll.

    Lancer la commande dos de l'environnement VS, aller dans le dossier de la dll puis taper :
    /regasm mydllname.dll /tlb:mydllname.tlb /codebase

    Créer le projet en C++ (hé oui en C j'ai pas trouvé j'ai dit)

    Exemple de code :

    d'abord importer la bibliothèque de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Import the type library.
    #import "ClassLibrary2.tlb"
    using namespace ClassLibrary2;
    En supposant que la DLL soit placé dans le meme dossier que l'appli CPP (exe ou dll, en général dans le dossier release) et que la TLB soit placée dans le dossier du projet CPP (avec le code source).

    Sinon varier les plaisir avec des trucs du genre :
    #import "..\mydllname\bin\Release\ClassLibrary2.tlb"

    ensuite utiliser la fonction qui vous intéresse comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	HRESULT hr = CoInitialize(NULL);
     
    	ClassLibrary2::myInterfacePtr myPtr(__uuidof(Class1));
     
    	long lResult = 0;
    	char buffer[256];
     
    	// Call the Add method.
    	myPtr->Addition(12,158, &lResult);
     
    	// Uninitialize COM.
    	CoUninitialize();
    En espérant que ça puisse vous servir autant qu'à moi.

    A+

    Male

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    tu peux regarder dans mon tutoriel, l'interopérabilité avec COM : http://nico-pyright.developpez.com/t...p2/#Lcominteop et le hosting de CLR http://nico-pyright.developpez.com/t...rop2/#Lhostclr pour plus de précisions

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Merci Nyco,

    Durant mes recherches j'étais tombé sur ton tuto que j'avais déjà archivé car bien utile au premeir regard.

    Malheureusement mon niveau ne me permet pas d'en comprendre toutes les subtilités.

    Vraissemblablement le "hotsing de CLR" (j'avoue que je ne sais même pas ce que ce cela veut dire) semblerait répondre à mes besoins si j'ai bien compris car la DLL managée serait placée dans le même dossier que mon appli et ne nécessiterait pas d'être référencée dans le registre (regasm) ?

    Je vais approfondir le sujet. Merci encore.

    A+

    Male

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

Discussions similaires

  1. Réponses: 18
    Dernier message: 25/06/2007, 10h45
  2. Réponses: 3
    Dernier message: 29/04/2006, 14h02
  3. comment utiliser les fonctions d'une dll
    Par sebled dans le forum MFC
    Réponses: 3
    Dernier message: 24/02/2006, 17h59
  4. Réponses: 4
    Dernier message: 17/03/2004, 18h24

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