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

VB.NET Discussion :

Reflexion sur une assembly se trouvant sur un emplacement réseau


Sujet :

VB.NET

  1. #1
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut Reflexion sur une assembly se trouvant sur un emplacement réseau
    Rebonjour,

    Aujourdh'ui j'ai plein de question

    J'essaie d'implémenter une fonctionnalité supplémentaire pour une dll de gestion de fenetres dockables. Cette fonctionnalité est la sauvegarde de l'environnement de travail courant. J'ai commencé par crée un fichier XML qui contient entre autre ça:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <disposition>
    	<tab>
    		<window class="TestDocking.UserControl1"/>
    On peut voir que j'ai un TabControl avec un contenu (dans un onglet).

    J'ai poursuivi en essayant d'instancier ma classe UserControl1 à partir de la chaîne de caractère "TestDocking.UserControl1" mais c'est là qu'est le problème..

    Étant donné que ma classe UserControl1 ne se trouve pas dans la même assembly que là où j'essaie de l'instancier, c'est plus compliqué d'un simple Type.GetType(className)..

    J'ai trouvé ça sur le net (source)
    Two things:

    You need to include the namespace of the type
    If the type isn't in mscorlib or the currently executing assembly, you need to specify the assembly name as well (including version numbers and public key information if it's a strongly-named assembly).
    So for instance, to get hold of System.Linq.Enumerable you'd need something like:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Type.GetType("System.Linq.Enumerable, System.Core, Version=4.0.0.0, " & _
                 "Culture=neutral, PublicKeyToken=b77a5c561934e089")
    Sauf que je ne trouve pas les données nécessaires (version, public key, etc.)..
    J’ai des questions à toutes vos réponses!

  2. #2
    Membre éprouvé
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Points : 1 111
    Points
    1 111
    Par défaut
    Tu as regardé du côté de la Reflexion ?

    Tuto

  3. #3
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    C'est déjà ce que je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Public Function GetInstance(ByVal strType As String) As Object
            Try
                Dim o = Activator.CreateInstance(Type.GetType(strType), New Object() {Me})
                Return o
            Catch ex As Exception
                MsgBox("Impossible d'instancier l'objet " + strType)
                Return Nothing
            End Try
        End Function
    mais j'ai besoin du type et comme l'objet ne fait pas partie de la même assembly, j'ai besoin du nom complet de l'assembly. J'ai d'ailleurs trouvé comment l'avoir par le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Public Function GetAssemblyFullName(ByVal o As Object)
            Dim myAssembly As [Assembly] = [Assembly].GetAssembly(o.GetType)
            If Not (myAssembly Is Nothing) Then
                Return myAssembly.GetName.FullName
            End If
            Return ""
        End Function
    Sauf que l'attribut PublicKeyToken = null.. C'est à nous de le définir auparavant?
    J’ai des questions à toutes vos réponses!

  4. #4
    Membre éprouvé
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Points : 1 111
    Points
    1 111
    Par défaut
    Ba si tu as le chemin de la DLL qui définit les types voulus, tu peux la chargée comme ça aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Assembly.LoadFile(cheminVersLaDll)

  5. #5
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Ça c'est nikel! Sauf que..

    VS ne veut pas charger l'assembly car elle se trouve sur un emplacement réseau:

    Exception:
    Tentative de chargement d'un assembly à partir d'un emplacement réseau qui aurait entraîné l'utilisation de l'assembly en mode Bac à sable (sandbox) dans les versions antérieures du .NET Framework. Cette version du .NET Framework n'activant pas la stratégie CAS par défaut, ce chargement peut être dangereux. Si ce chargement n'est pas destiné à utiliser l'assembly en mode Bac à sable (sandbox), activez le commutateur
    J'ai trouvé cette solution mais je ne trouve pas le bouton en question dans les propriétés..

    Je continue de chercher.
    J’ai des questions à toutes vos réponses!

  6. #6
    Membre éprouvé
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Points : 1 111
    Points
    1 111
    Par défaut
    Ah ouais moi non plus ^^

    T'as essayé la réponse d'en dessous, où il définit un AppDomain :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var appDomain = AppDomain.CreateDomain(assemblyName);
    var assembly = appDomain.Load(File.ReadAllBytes(assemblyName));

  7. #7
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Ouai mais j'ai pas réussi.. Cependant

    J'ai trouvé une solution! Dans le repertoire de l'application (même emplacement que le myApp.exe) j'ai crée un fichier de configuration manuellement et rempli comme ça:
    myApp.exe.config
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
       <runtime>
          <loadFromRemoteSources enabled="true"/>
       </runtime>
    </configuration>
    Et maintenant ça marche!

    Je poste mon code (que j'ai un petit peu modifié):
    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
        'exemple avec la dll "ClassLibrary1.dll"
        'ça fonctionne pour moi si strType = "ClassLibrary1.UserControl1"
        Public Function GetInstanceFromRemoteDLL(ByVal strType As String) As Object
            Try
                Dim parts As String() = strType.Split(".")
                Dim aPath As String = Application.StartupPath + "\" + parts(0) + ".dll"
                Dim a As Assembly = Assembly.LoadFile(aPath)
                Dim t As Type = a.GetType(strType)
                Dim o = t.GetConstructor({GetType(DockContainer)}).Invoke(New Object() {Me})
                Return o
            Catch ex As Exception
                MsgBox("Impossible d'instancier l'objet " + strType + vbCrLf + ex.Message)
                Return Nothing
            End Try
        End Function
    Merci pour ton aide Gurdil!
    J’ai des questions à toutes vos réponses!

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

Discussions similaires

  1. HttpWebRequest fonctionne sur une appli console, pas sur une appli Web
    Par hollywood dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 23/04/2009, 14h34
  2. Réponses: 0
    Dernier message: 03/04/2008, 15h14
  3. Réponses: 0
    Dernier message: 07/12/2007, 13h12
  4. Requete SUM sur une table avec critère sur une autre
    Par wail00 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/05/2007, 16h58
  5. [Access] Requête sur une table et tri sur une autre
    Par VooDooS dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/08/2006, 15h07

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