[HELP!!]Creer une DLL et l'utiliser dans un EXE

Broniz Messages postés 3 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 9 janvier 2008 - 9 janv. 2008 à 09:06
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 - 9 janv. 2008 à 16:39
Bonjour,

Je sais que plusieurs exemples et tutoriels ont déja été posé sur le sujet, mais je n'ai reussi à en faire fonctionner aucun ...
J'ai un Projet ClassLibrary et un projet ConsoleApplication. La DLL créée s'appelle HelloWorld.
Je n'arrive pas à référencer / instancer la DLL dans l'EXE.

Voila le code de l'EXE:

Imports System.Reflection
Imports System

Module ConsoDll
    Sub Main()
        Dim TYP As Type
        Dim asm As Assembly
        Dim obj As Object
        'On charge l'assembly HelloWorld.dll contenue dans C:\(vous mettez ici le chemin de l'assembly
        asm = Assembly.LoadFrom("C:\HelloWorld.dll")
        'On obtient le type d'application (nom_namespace.nom_classe)
        TYP = asm.GetType("HelloWorld.SayHello")
        'On créé une instance du type
        'On exécute la méthode DireBonjour
        obj = asm.CreateInstance("HelloWorld.SayHello")
        obj.DireBonjour()
        Console.WriteLine(obj.DireBonjour())
    End Sub
End Module

Et le code de la DLL:

Public Class SayHello
    Public Function DireBonjour()

        Return"Bonjour tout le monde"

    End Function
End Class

C'est un exemple que j'ai repris sur un tuto du site.

Le message d'erreur qui m'est renvoyé:
"L'assembly nommé 'ClassLibrary1' a été chargé à partir de 'file:///C:/HelloWorld.dll' à l'aide du contexte LoadFrom. L'utilisation de ce contexte peut provoquer un comportement inattendu lors des opérations de sérialisation, de cast et de résolution de dépendance. Dans la grande majorité des cas, il est recommandé d'éviter le contexte LoadFrom. Pour ce faire, il suffit d'installer les assemblys dans le Global Assembly Cache ou dans le répertoire ApplicationBase et d'utiliser Assembly.Load lors du chargement explicite des assemblys."

J'ai essayé différentes méthodes pour charger la DLL dynamiquement, mais aucun résultat.

Si j'essai d'enregistrer la DLL avec regsvr32, Il m'enregistre la DLL mais me dit qu'il ne trouve pas le point d'entrée.

J'utilise VB 2005 Express et Visual Studio 2005.

Merci de votre aide.

4 réponses

Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
9 janv. 2008 à 09:44
Tiens bizarre j'ai utilisé ça aussi récemment et aucun problème.
Le message d'erreur indique que cela "peut" poser un problème mais pas qu'il y en a eu un, regarde si tu ne peux pas désactiver cette exception dans le menu Debug.

Par contre la ligne suivante qui va te poser un problème c'est
"obj.DireBonjour()"
car obj est déclaré comme objet et ne contient pas cette méthode. Pour l'appeler, soit tu fais de la réflection, soit tu déclare une interface contenant DireBonjour que SayHello devra implémenter et tu déclare obj en tant que cette interface.

<hr size="2" width="100%" />Julien.
0
Broniz Messages postés 3 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 9 janvier 2008
9 janv. 2008 à 10:14
Je vois comment faire une interface (meme notion objet qu'en Java je pense), mais qu'appelle tu "reflection" ?

C'est vraiment bizarre étant donné que plusieurs personnes ont réussi à le faire fonctionner du 1er coup ...
0
Broniz Messages postés 3 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 9 janvier 2008
9 janv. 2008 à 10:47
Aprés avoir désactivé les messages d'erreurs, cela fonctionne ...
Merci de votre aide, je vais essayer votre methode tout de meme car je souhaiterais comprendre ...
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
9 janv. 2008 à 16:39
Salut,
Content que ça fonctionne !

Oui les interfaces c'est comme en Java.

La réflection c'est la capacité d'un programme à examiner ses structures internes de haut-niveau (dixit wikipedia). Par exemple ça permet de traiter une classe d'objet comme un objet elle même afin d'obtenir par exemple des variables représentant les méthodes ou les propriétés d'un type donné.
Dans ton cas, tu aurais pu rechercher la méthode (SayHello) a priori inconnue de obj grâce à son nom, et utiliser la réflection pour l'invoquer.
Un exemple vaut mieux que mes piètres explications, tu peux jeter un oeil à celui de cette page.
C'est peut-être un peu dur à saisir comme concept au début ^^, mais en fait c'est assez simple et ça permet plein de trucs (comme par exemple utiliser les champs privés d'une classe etc...).
Si tu veux en savoir plus, explore l'espace de noms System.Reflection et puis Google :D.

<hr size="2" width="100%" />Julien.
0
Rejoignez-nous