Appeller une dll dynamiquement (dans le code)

5/5 (12 avis)

Snippet vu 15 572 fois - Téléchargée 32 fois

Contenu du snippet

Bon alors le but de ce code est d'appeler une fonction d'une dll sans la référencer au projet.

Les avantages:
- On peut appeller une fonction par un interface utilisateur
- On peut avoir plusieurs dll, et on peut choisir dans quel dll appeler une fonction (Ex.: Dll multilangue séparés)
- Tout autre chose qui peut servir dont on peut pas faire en la référancant :P

Les inconvénients:
- Les subs ne fonctionnent pas (juste les fonctions)
- La fonction doit etre dans un module
- Sa fonctionne peut-être juste avec les dll Vb.Net (j'ai pas tester les dll Win32)

Pourquoi ce code m'est utile?
Bah parce que je fait un serveur html compatible http 1.0 et 1.1 et je veux faire un genre de script cgi mais avec des dll vb.net (je connais pas les cgi)

Source / Exemple :


'Pour créer une dll vb.net compatible:
'=====================================
'
' Créer un nouveau projet 'Class Library' (je l'ai en anglais dsl)
' Ajouter un module (renommez comme bon vous semble)
' Ajouter votre fonction dans le module et compiler la dll
'
' Ps.: La classe que vb.net a créer ne doit pas etre effacer mais elle peut rester vierge.
'      Vous pouvez aussi utiliser la classe pour que la dll soit aussi référencable.
'
'
'Exemple de projet Class Library (compilé 'MaDll.dll'):
'======================================================
'
' Contient 1 classe nommé 'MaClasse'
' Contient 1 module nommé 'MonModule'
'
' Dans le module:
'
' Public Function Additionner(Byval Number1 As Long, Byval Number2 As Long) As Long
'
'     Return Number1 + Number2
'
' End Function
'
' Public Function MessageBox(Byval MonTitre As String, Byval MonMessage As String) As Object
'
'     MsgBox(MonMessage, , MonTitre)
'
' End Function
'
'Exemple pour l'utiliser (un projet normal):
'===========================================
'
' Pour appeler la fonction Additionner:
' -------------------------------------
'
' Dim MesParams(1) As Object
' 
' MesParams(0) = 10
' MesParams(1) = 5
'
' MsgBox(CallDll("MaDll.dll", "MonModule", "Additionner", MesParams) 'Retourne 15
'
'
' Pour appeler la fonction MessageBox:
' -------------------------------------
'
' Dim MesParams(1) As Object
'
' MesParams(0) = "MonTitre"
' MesParams(1) = "MonMessage"
'
' CallDll("MaDll.dll", "MonModule", "MessageBox", MesParams) 'Affiche un MsgBox (Titre="MonTitre", Message="MonMessage")
'
'======================================================================================
'Le code ci-dessous est à placer dans un module de votre projet qui va accéder a la dll

Imports System.Reflection

    Function CallDll(ByVal Filename As String, ByVal [Module] As String, ByVal Method As String, ByVal Param() As Object) As Object

        Try 'Essaie d'appeller la dll

            Dim MyAssembly As Assembly = Assembly.LoadFrom(Filename)'Load la dll
            Dim MyAssemblyName As String = Left(MyAssembly.FullName, InStr(MyAssembly.FullName, ",") - 1) 'Trouve le nom du projet
            Dim MyType As Type = MyAssembly.GetType(MyAssemblyName & "." & [Module]) 'Trouve le bon module
            Dim MyMethod As MethodInfo = MyType.GetMethod(Method) 'Trouve la méthode

            Return MyMethod.Invoke(MyMethod, Param) 'On appelle la méthode et on retourne sa valeur

        Catch 'La dll/module/méthode n'a pas été trouver, on ne retourne rien

            Return Nothing

        End Try

    End Function

Conclusion :


Soyez aimable, je viens de migrer de vb6 a vb.net ya même pas 1 semaine ;)

Je posterai un zip avec un exemple et je vais essayer avec d'autre type de dll quand j'aurai plus de temps.

@+

A voir également

Ajouter un commentaire

Commentaires

Messages postés
235
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
16 mai 2011
2
Par contre, juste une question. Quand on fait appel à une dll, elle est instancié, mais comment la dés-instancie-t'on? En effet, une fois la fonction utilisée, la dll est toujours "utilisé" par l'application maîtresse (il suffit d'essayer de la supprimer une fois que votre fonction a été exécutée pour voir que ce n'est pas possible et que la dll est toujours instancié). Donc grossièrement, comment libère-t-on la dll?
Messages postés
235
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
16 mai 2011
2
Ce code fonctionne très bien, par contre, une fois la fonction utilisé, la dll reste instancé.
J'ai crée une dll avec un "sub new", ainsi que les fonctions que j'appelle.
Lorsque j'appelle ma fonction, la dll est instancé, le sub new est appelé puis la fonction. Mais une fois la fonction utilisé, la dll reste instancié et je ne sais pas comment la "libérer" (si vous essayer d'appeler votre fonction, une fois terminée, vous ne pouvez pas supprimer la dll tant que le programme principal qui l'a appelé est encore ouvert).

Savez-vous comment faire?
Messages postés
235
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
16 mai 2011
2
Avec le commentaire de LTourist en plus, cette source fait parfaitement son travail, et ça fonctionne à merveille.

Merci à vous deux ;)
Messages postés
227
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
26 avril 2012

Bonjour, est il possible d'appeler une dll système de Windows ?
Messages postés
33
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
21 février 2006

Ca c'est sur, il y a de l'amour dans l'air....
Si un jour tu reviens pense à nous !!!
Afficher les 12 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.