begin process at 2012 02 16 10:33:41
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

VB.NET

 > APPELLER UNE DLL DYNAMIQUEMENT (DANS LE CODE)

APPELLER UNE DLL DYNAMIQUEMENT (DANS LE CODE)


 Information sur la source

Note :
9,5 / 10 - par 2 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :VB.NET Source .NET ( DotNet ) Classé sous :dll, pointeur, externe Niveau :Initié Date de création :22/01/2006 Date de mise à jour :22/01/2006 22:16:13 Vu :13 663

Auteur : frank150

Ecrire un message privé
Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

 Description

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

  • '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
'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.

@+


 Historique

22 janvier 2006 22:16:13 :
Ajout d'un exemple concret, de commentaires et de gestion d'erreur

 Sources du même auteur

COBJ - RETOURNE L'OBJET À PARTIR D'UN STRING
Source avec Zip ENLEVEZ LES NUMÉROS DE LIGNES DANS LES SOURCES SUR VBFRANCE
Source avec Zip Source avec une capture Source .NET (Dotnet) TROUVER LE FICHIER LIÉ À UN RACCOURCI

 Sources de la même categorie

Source .NET (Dotnet) MODIFICATION DATE DE WINDOWS EN VB.NET ET VBA par us_30
Source avec Zip Source avec une capture Source .NET (Dotnet) ENVOI DE MAIL AVEC PIÈCE JOINTE par EhJoe
Source .NET (Dotnet) AMUSONS NOUS AVEC UN LABEL ^^ par Adn56
Source avec Zip Source avec une capture Source .NET (Dotnet) UN NAVIGATEUR INTERNET EN VB.NET par azrti
Source avec Zip Source .NET (Dotnet) CONVERSION DE DEVISE MONAITAIRE VIA UN SERVICE WEB par bigmonkey7

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture BOULE DE CRISTAL par BLUEBIBUBBLE
Source avec Zip Source avec une capture Source .NET (Dotnet) GÉNÉRATEUR DE GRAPHIQUE par pascamau
Source avec Zip DLL PERSONNALISÉ AVEC ÉVÈNEMENTS ET PROPRIÉTÉS EN VB6. par Number7
Source .NET (Dotnet) CLASSE .NET DE LECTURE/ÉCRITURE DANS LA BASE DE REGISTRE par NikatorS
Source avec Zip APPELER DES POINTEURS DE FONCTIONS DEPUIS VB par ShareVB

Commentaires et avis

Commentaire de frank150 le 23/01/2006 08:26:40

Je suis entrain de faire un exemple que je posterai probablement demain.

J'en ai profiter pour rajouter quelques fonctions:

   - Lister les objets d'un fichier (classe/form/module/etc..)
   - Lister les méthodes public associés à l'objet (fonction/sub/property)
   - Lister les paramètres de l'objet si il y en a
   - Retourne le type de donnée qu'une fonction renvoie
   - On peut appeler les fonctions avec seulement le nom du fichier
     (il le cherche dans le dossier du programme)

Avec ces fonctions rajoutés, sa ressemble plus à un décompilateur mais bon :)
Ps.: Sa fonctionne seulement avec des fichiers compilés VB.Net

Commentaire de viarn le 19/02/2006 20:17:58

Salut, je viens de trouver ton code qui à l'ai très intéressant. Cependant je n'est pas VB.NET alors est-ce que ta source existe en vb6 ?

Bon courage

A+ vincent

Commentaire de Zylott le 30/05/2006 16:17:13

Bonjour,
Idem
je n'utilise pas VB.NET mais VB6 ...
est-il possible de faire la meme chose en vb6 (appel dynamique d'une DLL) ?
ou puis-je trouver la source si elle existe ?
D'avance merci.

Commentaire de benhassanovich le 06/06/2006 13:21:42

moi j'ai un tout autre pb. j'aimerais créer une dll avec VB6 que je pourrais utiliser en vb.net
coment faire?

Commentaire de LTourist le 20/06/2006 15:35:57

Cette source est tres interressante, cependant j'ai un gros probleme avec...Impossible d'appeler des fonctions se trouvant dans des Class, pourquoi? Pourquoi devoir obligatoirement passer par des modules? C'est dommage car je fais un systeme de plugin avec une interface, et on ne peut pas utiliser implements dans les modules, donc je suis bloqué... Si tu pouvais m'aider merci :)
Et aussi ou sont les fonctions que tu a rajouté? je ne les vois pas...
Merci ;)

Commentaire de LTourist le 20/06/2006 16:01:28

J'ai trouvé comment faire pour appeler une methode qui se trouve dans une classe, en me basant sur d'autre source, ça serait intéressant si tu pouvais rajouter ceci dans la tienne :) :

Dim MyAssembly As Assembly = Assembly.LoadFrom(Filename) 'Load la dll
Dim MyType As Type = MyAssembly.GetType(MyAssemblyName & "." & ModuleName) 'Trouve le bon module        
Dim MyMethod As MethodInfo = MyType.GetMethod(Method) 'Trouve la méthode
Dim MyObject As Object = Activator.CreateInstance(MyType) 'Crée une instance de la classe
Return MyMethod.Invoke(MyObject, Param) 'Appelle la méthode

Et pour ceux qui n'auraient pas encore bien compris le principe, le moyen d'appeler une propriété :

Dim MyAssembly As Assembly = Assembly.LoadFrom(Filename) 'Load la dll
Dim MyType As Type = MyAssembly.GetType(MyAssemblyName & "." & ModuleName) 'Trouve le bon module        
Dim MyProp As PropertyInfo = MyType.GetProperty(Method) 'Trouve la propriété
Dim MyObject As Object = Activator.CreateInstance(MyType) 'Crée une instance de l'objet
Return MyProp.GetValue(MyObject, Param) 'Appele la propriété et on retourne sa valeur

Voila merci beaucoup et je mets une exellente note a cette source qui m'a permis un grand bon en avant :D

Je me permets egalement de faire de la pub pour cette autre source qui permet de trouver toutes les methodes etc d'une classe (je trouve que les deux sources se completent), j'espere que tu ne m'en voudra pas :)

http://www.vbfrance.com/codes/ALLOCATION-DYNAMIQUE-DLL-VB-NET-METHODES-SYSTEM-REFLECTION_35496.aspx

Voila merci encore ++ :D

Commentaire de frank150 le 21/06/2006 07:32:14

bonjour les gars!

bon dsl de mon absence mais présentement jpense plus vraiment a coder ni meme en vb6 ou .NET
jsais pas pourquoi mais jy ai perdu gout.

en tk, j'espere p-e y reprendre gout un jour mais pour l'instant.

Bonne chance à vous et à VBFrance

Commentaire de viarn le 21/06/2006 22:14:25

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

Commentaire de ABF le 16/08/2010 09:18:33

Bonjour, est il possible d'appeler une dll système de Windows ?

Commentaire de EvilGost le 17/01/2011 14:48:23 10/10

Avec le commentaire de LTourist en plus, cette source fait parfaitement son travail, et ça fonctionne à merveille.

Merci à vous deux ;)

Commentaire de EvilGost le 07/12/2011 10:50:42

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?

Commentaire de EvilGost le 07/12/2011 16:02:50

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?

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Pointeur mémoire [ par OBI76 ] Salut !G un gros problème : pour faire un plugin pour winamp, j'ai été obligé d'utiliser une dll "vblink" reconnue par winamp et qui va dans la ram ch lire une variable externe à VB [ par igorpastis ] salutj'ai un petit problemeje fais appel a une fonction externe (une dll) ! jusqu'ici ca marche voila mon appel:Private Declare Function vbmoby_readDE A l'aide:comment integrer une DLL avec des pointeur [ par marko34 ] Au secours, je dois utiliser en dotnet une DLL ecrite en C++ et qui bien sur renvoi des pointeurs. J'arrive a l'integrer mais impossible de recuperer  Appel de fonctions dans une DLL externe [ par Danette ] Bonjour,Je me suis acheter un CD-ROM annuaire téléphonique et il est évident que la base de données des numéro et des adresses est appellée par le pro Composant qui appelle lui même une autre dll (références projet) [ par TigerFab ] Bonjour,Voici ma question:Lorsque vous achetez un composant, genre Infragistics, lorsque vous ajoutez de la boîte d'outil un des nombreux composants s Pointeur d'un tableau à 2 dimensions vers DLL C++ [ par Feanor06 ] Bonjour, Voilà, j'ai un exe principal en VB.net (VS2008 Express) et une DLL en C++ (Dev-C++). Je dois passer en paramètre à une fonction de la DLL u Récupérer un pointeur envoyé à une DLL [ par JSilvere ] Bonjour, Je suis en train de créer un programme utilisant une DLL développée en C++... Cette DLL me sert à me connecter à un automate. J'arrive à co vb6fr dll est introuvable ? [ par charif591 ] Salut à tous. J'ai fait un programme avec vb6. On ne peut l'utiliser que dans l'ordinateur où vb6 est installer. comment en peut résoudre ce problèm insérer d'une référence externe dwg avec macro vba [ par fabdu91630 ] Bonjour, Je suis novice dans la programmation VBA et j'ai besoin d'aide : J'ai besoin de créer une macro en VBA qui me permettrai de insérer une réf construire une dll [ par riganemed ] salut ! pouvez vous m'aidez a reconstruire une dll a partir du fichier ci dessous qui contient le source afin que je me puisse l'ajouter comme référen


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,229 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales