Problème de DLL et interface

Résolu
cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 - 14 juil. 2007 à 20:02
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 - 14 juil. 2007 à 22:37
Bonjour tout le monde,

j'ai un petit problème sous Visual Basic 2005
je veux ajouter la possibilité de charger des plugin dans mon application. J'ai récupéré des exemples qui fonctionne très bien. Ils sont basic, mais très bien fait.
http://www.vbfrance.com/codes/APPLICATION-AVEC-PLUGINS_35652.aspx

Bon voilà mon problème
Un projet Plugin qui possède une interface "iPlugin"
j'ai une application, qui référence la DLL de "iPlugin", appelons là "application" lol
Un projet myPlugin, qui référence la DLL de "iPlugin", qui possède une class "plug" qui implémente "iPlugin"

Donc en gros j'ai 2 applications qui référence mon interface "iPlugin"

Ensuite, dans "application" je fais ceci

-------------------------------------------
    Public Sub New()

        ' Cet appel est requis par le Concepteur Windows Form.
        InitializeComponent()

        ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
        Dim tx As String
        Dim dll As Reflection.Assembly
        Dim tp As Type
        'chargement du plugin1
        tx = "C:\Documents and Settings\Administrateur\Mes documents\Visual Studio 2005\Projects\PlugTest\PlugTest\bin\Debug\PlugTest.dll"   'emplacement de la dll
        'chargement de la dll
        dll = Reflection.Assembly.LoadFrom(tx)

        'Vérification de la présence de l'interface recherchée
        Try
            For Each tp In dll.GetTypes
                If tp.IsClass Then
                    If tp.GetInterface("iPlugin", True) IsNot Nothing Then
                        'création de la référence au plugin
                        i1 = dll.CreateInstance(tp.ToString)
                        Exit Try
                    End If
                End If
            Next
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

        testt(New Outil2)
    End Sub

    Private Sub testt(ByVal outil As [Plugin].iOutil)
        Try
            CType(i1, Plugin.iPlugin).ReceiveOutil(outil)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Dim i1 As [Plugin].iPlugin
---------------------------------------------

En théorie, je devrais loader "myPlugin" et ensuite appeller la méthode "ReceiveOutil" pour lui envoyer quelques informations

Mais je Bug avant ça
je trouve mon Plugin dans le For
mais dès que je load, ça plante "i1 = dll.CreateInstance(tp.ToString)"

En gros, il dit que "myPlugin" ne peux pas être convertie de type "iPlugin", malgré que ma class implément réellement l'interface. J'ai même essayé avec héritable et ceci donne le même résultat.

On dirait à l'intérieur d'un même projet, il gère bien le passage de class vers le type interface qui implémente, mais ceci n'a pas l'air de marche si la class arrive d'une DLL.

ce que je comprend le moins, c'est que l'exemple fonctionne très bien et si je fait un ctype(dll.CreateInstance(tp.ToString),"iPlugin") sur mon projet, il n,est pas capapble, mais dans l'exemple oui ??? Pourtant je me suis bien assurer que l'interface utilisé était bien la même, c'est même exactement le même fichier sur mon disque dur et j'ai bien regéré tout les projet

Quelqu'un peut m'aider ???

-------------------------------------------------
Dragon alias aussi Waxime mais bon, pas le gout de refaire un nouveau profil lol
-------------------------------------------------

2 réponses

cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
14 juil. 2007 à 21:04
j'ai trouvé
je pointais sur le répertoire Debug au lieu de Release. Étrange, puisque je n'ai jamais changé mon répertoire à release ???

-------------------------------------------------
Dragon alias aussi Waxime mais bon, pas le gout de refaire un nouveau profil lol
-------------------------------------------------
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
14 juil. 2007 à 22:37
Par défaut, le répertoire Debug est utiliser lorsque tu compile le projet en mode debug, c'est à dire en gros quand tu lance l'execution depuis l'environnement de VB

Le répertoire Release contient la version finale de ton application, c'est celle-là que tu dois normalement diffuser. Elle est obtenue en solicitant la commande Générer le projet ou la solution (suivant version) par le Menu Generer ou par le menu contextuel du projet.

Tout ça dans le fonctionnement par défaut et si tu n'as pas changer la configuration active dans les propriétés du projet

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
Rejoignez-nous