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

C# Discussion :

AppDomaine ! j'y arrive pas. [Fait]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut AppDomaine ! j'y arrive pas.
    Bonjour,

    Je n'arrive pas à utiliser les domaine d'application en C#.


    Mon application utilise de nombreuse dll. dont certaines constituent des extensions de l'application principale. Le problèmes est que ces dll ont parfois des références en commun mais avec des versions différentes.
    Donc pour éviter tout problèmes, j'ai pensé à charger ces dll dans des domaines d'applications différents.

    Au cours de mes investigations, je suis tombé sur ce tuto : http://vincentlaine.developpez.com/t...domain/csharp/

    cependant, je n'y arrive toujours pas

    Comme indiqué, j'ai composé mon affaire en 3 étapes :
    1. L'appli principale créé un nouveau AppDomaine
    2. On cré dans ce nouveau domaine une instance d'un objet que j'ai nommé AssemblyLoader qui sera chargé de chargé les dll dans le nouveau domaine d'application
    3. Via le Loader, on charge les dll dans le nouveau domaine et on récupère une instance de l'objet désiré.


    Voici le code de l'appel dans l'appli principale
    Code c# : 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
    20
    21
     
    	// Creation of the domain app 
                AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
                setup.ApplicationBase = filesManager.BinFolderAbsolutePath;
                setup.PrivateBinPath = filesManager.BinFolderAbsolutePath;
                setup.ShadowCopyFiles = "false";
                string appDomName = "Extension_" + Guid.NewGuid();
                AppDomain newExtension = AppDomain.CreateDomain(appDomName, null, setup);
     
                // Create Loader for assembly
                string loaderPath = Path.Combine(filesManager.BinFolderAbsolutePath, "AssemblyLoader.dll");
                object tmp = newExtension.CreateInstanceFromAndUnwrap(loaderPath, "AssemblyLoader.AssemblyLoader");
                AssemblyLoader.AssemblyLoader loader = tmp as AssemblyLoader.AssemblyLoader;
     
                // Load IExtension
                object result = null;
                if (loader != null)
                {
                    string assemblyPath = Path.Combine(filesManager.BinFolderAbsolutePath, "Extension.dll");
                    result = loader.CreateInstanceOf(assemblyPath, typeof(IExtension));
                }

    Déjà ça plante dés le début avec mon objet tmp. quand j'exécute pas à pas mon programme, les attributs de l'objet tmp qui est un {System.Runtime.Remoting.Proxies.__TransparentProxy}
    ne contiennent que des erreurs ou plus exactement des piles d'appels.
    Par exemple l'attribut __identity contient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    System.Runtime.Remoting.RemotingException: Remoting cannot find field '__identity' on type 'System.MarshalByRefObject'.
       at System.Object.GetFieldInfo(String typeName, String fieldName)
       at System.Object.FieldGetter(String typeName, String fieldName, Object& val)
       at System.Object.FieldGetter(String typeName, String fieldName, Object& val)
       at System.RuntimeFieldHandle.GetValue(Object instance, RuntimeTypeHandle fieldType, RuntimeTypeHandle declaringType, Boolean& domainInitialized)
       at System.Reflection.RtFieldInfo.InternalGetValue(Object obj, Boolean doVisibilityCheck, Boolean doCheckConsistency)
       at System.Reflection.RtFieldInfo.GetValue(Object obj)
       at Microsoft.Office.Tools.Debugger.Tools.TryCreateDebuggerItem(MemberInfo member, Object target, __Item& item)	System.Runtime.Remoting.RemotingException
    Mais le problème apparaît sûrement plus haut, car si je regarde l'objet AppDomain newExtension, lui aussi ses attributs sont remplis d'erreurs... comme l'attribut AssemblyLoad (exemple ci-dessous).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    AssemblyLoad	:
    System.Runtime.Remoting.RemotingException: Remoting cannot find field 'AssemblyLoad' on type 'System.AppDomain'.
       at System.Object.GetFieldInfo(String typeName, String fieldName)
       at System.Object.FieldGetter(String typeName, String fieldName, Object& val)
       at System.Object.FieldGetter(String typeName, String fieldName, Object& val)
       at System.RuntimeFieldHandle.GetValue(Object instance, RuntimeTypeHandle fieldType, RuntimeTypeHandle declaringType, Boolean& domainInitialized)
       at System.Reflection.RtFieldInfo.InternalGetValue(Object obj, Boolean doVisibilityCheck, Boolean doCheckConsistency)
       at System.Reflection.RtFieldInfo.GetValue(Object obj)
       at Microsoft.Office.Tools.Debugger.Tools.TryCreateDebuggerItem(MemberInfo member, Object target, __Item& item)	System.Runtime.Remoting.RemotingException
    En fait à l'exception des champs que je remplis à la main, tous contiennent des erreurs de ce genre.

    En espérant que quelqu'un puisse m'aider
    Ikit

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    Rebonjour..
    J'en profite pour faire un ptit up de mon problème.


    J'ai trouvé le problème. En fait ça coince dés l'appel à la méthode CreateDomain de AppDomain.


    J'ai fait le test suivant :
    Code C# : 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
    20
    21
    22
    23
    24
    25
     
                AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
                setup.ApplicationBase = filesManager.BinFolderAbsolutePath;
                setup.PrivateBinPath = filesManager.BinFolderAbsolutePath;
                setup.ShadowCopyFiles = "false";
                string appDomName = "Extension_" + Guid.NewGuid();
     
                AppDomain newExt = AppDomain.CreateDomain(appDomName, null, setup);
    // the newExt AppDomain is strange look screenshot
     
     
     
                // Create Loader for assembly
                string loaderPath = Path.Combine(filesManager.BinFolderAbsolutePath, "AssemblyLoader.dll");
     
    // TEST : Load assembly from new AppDomain
                object tmp = newExt.CreateInstanceFromAndUnwrap(loaderPath, "AssemblyLoader.AssemblyLoader");
                AssemblyLoader.AssemblyLoader loader = tmp as AssemblyLoader.AssemblyLoader;
     
                // result : tmp is strange
     
    // TEST : Load assembly from actual AppDomain
                object tmp2 = AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap(loaderPath, "AssemblyLoader.AssemblyLoader");
     
                // result : tmp2 is a AssemblyLoader object... So it's work fine


    Dés la création de l'AppDomain j'obtiens un truc trop bizarre : http://imagebin.org/42698


    Pourtant la création du domaine me semble simple ... Je ne vois pas quelle erreur j'aurais pu commettre... Il n'y a qu'un seul appel de fonction

    Est-ce que par hasard il n'y aurait pas une option particulière à activer à la compilation ou un truc du genre ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    Est-ce que certains d'entre-vous pourrez faire le test suivant :

    Créer une nouvelle solution type console et appeler la méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AppDomain newDomain = AppDomain.CreateDomain("myDomain");
    Exécuter ensuite le programme en "debug pas à pas" et regarder ce que vaut l'objet newDomain

    Chez moi mon objet semble complétement vérolé : comme le montre ma précèdente capture


    J'aimerais savoir si j'ai vraiment un problème sur mon PC ou si il s'agit d'un bug dans le framework .NET ?
    J'utilise le .NET 3.5 SP1, et j'ai Windows XP pro SP2 (32 bits)... La doc MSDN de Microsoft semble pourtant dire qu'il n'y a aucun problème

Discussions similaires

  1. [Kylix 3] Je n'arrive pas à utiliser MySQL
    Par usebob dans le forum EDI
    Réponses: 4
    Dernier message: 15/04/2005, 10h18
  2. problème que je n'arrive pas à résoudre de façon récursive
    Par miam dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 31/07/2004, 11h21
  3. [Function] N'arrive pas à sortir
    Par bouboussjunior dans le forum ASP
    Réponses: 3
    Dernier message: 14/06/2004, 16h36
  4. Je n'arrive pas à détruire une fenêtre
    Par CORREGE Frédéric dans le forum MFC
    Réponses: 6
    Dernier message: 22/02/2004, 20h28
  5. j'arrive pas a arreter mon thread d'arriere-plan
    Par ms91fr dans le forum Langage
    Réponses: 6
    Dernier message: 06/06/2003, 21h36

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