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

Framework .NET Discussion :

Chargement des Assembly dans un domain personnalisé


Sujet :

Framework .NET

  1. #21
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Sphax Voir le message
    1) créer un appDomain
    2) charger dans ce domaine avec un Assembly.Load ton assembly "pont", appelons la BridgeAssembly
    3) créer un objet Bridge dans le nouveau domaine
    4) appeler Bridge.LoadAssembly(nom de l'assembly)
    5) En général ta classe Bridge se chargera aussi d'exécuter du code de l'assembly temporaire, sinon tout ça ne servirait à rien.

    EDIT: petite précision, je pense que la classe Bridge doit hériter de MarshalByRefObject, pour que l'objet Bridge vive réellement dans le nouvel appDomain.
    Je te remercie pour ce message, mais je t'avoue que c'est un un peu obscur Aurais tu la gentillesse de me mettre un petit exemple de code ?

    [EDIT] je me suis lancé dans le code.
    J'ai donc une classe AssemblyLoader, héritant de MarshalByRefObject.

    Actuellement, j'ai :
    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
    16
    17
    18
    19
     
    // Creation du domaine :
    AppDomainSetup appDomainSetup = new AppDomainSetup( );
    appDomainSetup.ShadowCopyFiles = "true";
    appDomainSetup.ApplicationBase = path + @"bin\debug\";// System.Environment.CurrentDirectory;
    appDomainSetup.DisallowBindingRedirects = false;
    appDomainSetup.DisallowCodeDownload = true;
    appDomainSetup.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
     
    Evidence baseEvidence = AppDomain.CurrentDomain.Evidence; 
    Evidence evidence = new Evidence(baseEvidence);
    domain = AppDomain.CreateDomain("SoaDomain", evidence, appDomainSetup);
     
    AssemblyLoader aload = (AssemblyLoader)domain.CreateInstanceAndUnwrap(
                            AssemblyName.GetAssemblyName("toto.dll").FullName, "toto.dll");
     
    XXXX
     
    AppDomain.Unload(domain);

    Seulement comment accederr à ma dll "toto.dll" a partir de mon AssemblyLoader ?

  2. #22
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut

    AssemblyLoader aload = (AssemblyLoader)domain.CreateInstanceAndUnwrap(
    AssemblyName.GetAssemblyName("toto.dll").FullName, "toto.dll");

    Seulement comment accederr à ma dll "toto.dll" a partir de mon AssemblyLoader ?
    Je ne comprends pas cet appel à CreateInstanceAndUnwrap, le deuxième argument est censé être un nom de type. Toto.dll c'est quoi, l'assembly que tu souhaite charger dynamiquement puis plus tard décharger, ou celle qui contient ton objet AssemblyLoader ?

    Pour un exemple de code, la doc de la méthode CreateInstanceAndUnwrap devrait pouvoir t'aider. Dans leur exemple ils définissent une classe Worker qui possède une méthode PrintDomain, cette méthode sera appelée depuis le nouveau domaine. Toi il te suffit de définir une méthode "void LoadAssembly(string assemblyName)" ... Est-ce que c'est plus clair ?

  3. #23
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Effectivement, mon 2nd paramètre ne voulait rien dire.
    Le problème est que ce que je souhaiterais, c'est avoir accès à l'ensemble des types (que je connais pas à l'avance) de mon Assembly.

    [Edit] Fondamentalement, je ne suis pas sur de devoir utiliser CreateInstanceAndUnwrap, puisque je ne souhaites pas instancier un type de mon Assembly. pour que cela soit clair, je souhaites :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                        c = Assembly.LoadFrom("toto.dll");
                        Type[] types = (c.GetTypes());

  4. #24
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Je pense que tu n'as pas saisi un truc là. Je ne peux que te renvoyer vers mon message ou je récapitule les différentes solutions.

    Si tu veux inspecter des assemblies et c'est tout (pas instancier des objets) alors tu peux utiliser Assembly.ReflectionOnlyLoad. Cette méthode ne chargera pas l'assembly.

    Si tu veux exécuter du code d'une assembly, alors, dans une assembly à toi, que tu peux appeler BridgeAssembly, tu définis un type Bridge qui dérive de MarshalByRefObject et qui possède par exemple une méthode "LoadAssembly(string assemblyName)". Tu crées un second appDomain, dans lequel tu instancies un objet Bridge, ça donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    domain = AppDomain.CreateDomain("SoaDomain", evidence, appDomainSetup);
     
    Bridge bridge = (Bridge )domain.CreateInstanceAndUnwrap("BridgeAssembly.dll", "Bridge");
    bridge.LoadAssembly("toto.dll");
    EDIT: oups j'avais pas vu ton edit . Donc regarde du coté de ReflectionOnlyLoad.

Discussions similaires

  1. SDL Chargement des BMP dans la memoire RAM ?
    Par CLion dans le forum SDL
    Réponses: 11
    Dernier message: 03/05/2008, 02h46
  2. [MySQL] chargement des données dans un formulaire
    Par super-java dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 22/04/2008, 12h49
  3. Chargement des DLL dans le code C++
    Par Triste dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2008, 09h29
  4. probleme de chargement des extensions dans une dll
    Par Syl_20 dans le forum OpenGL
    Réponses: 3
    Dernier message: 03/07/2007, 08h37
  5. chargement des images dans une table
    Par sandy07 dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/04/2007, 09h37

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