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 :

Révision sur Processus, Domaine d'apllicacation, DLL


Sujet :

Framework .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 103
    Par défaut Révision sur Processus, Domaine d'apllicacation, DLL
    Voila, je me pose quelques questions:

    Je ne comprend pas bien tous les concepts de
    - Processus
    - Domaine d'application
    - Assembly
    - Modules

    Ou pourrais-je trouvé de la doc la dessus.



    En fait je crée une appli qui possède un éditeur de macro C#.
    Les macros sont créer dynamiquent et chargé dynamiquement.

    Mon souci, est que si l'utilisateur a fait une erreur dans sa macro, il est obligé de recompiler sa macro et de rechargé l'assembly. J'ai donc 2 fois l'assembly de charger. L'execution de la macro est plus lente.

    Donc je souhaite décharger l'assembly apres son utilisation. Du coup il n'y aura plus de probleme. Pour pouvoir déchargé un assembly il faut que je décharge le domaine d'application. Le probleme est que l'assembly à été chargé dans le domaine principal de l'appli.

    Je peux créer un domaine exprès pour la compilation des macros.
    Tous cela devrait marché.
    Suis-je sur la bonne voie.



    Autre question:
    Dans ma macro, je souhaite lancer le Garbage Collector. Le souci est que le garbage collector ne lache pas de memoire, il en consomme BIZARRE.
    Une fois la macro terminé, si mon appli demande GC:Clean ca marche bien.
    Quelqu'un aurait-il une idée pourquoi le garbage collector ne marche pas quand il est appelé a partir de ma dll chargé dynamiquement.

    J'ai de gros souci avec la gestion de la memeoire dans les macros???
    certaine macro sont gourmande. leur execution prend 600Mo. Une fois que mon appli demande un GC:Clean je récupere 400Mo. C'est enorme.

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 103
    Par défaut
    J'ai trouvé pas mal de réponse dans les tuto:
    http://drq.developpez.com/dotnet/art...gin/csharp/#L3

    et

    http://vincentlaine.developpez.com/t...domain/csharp/



    Par contre je ne comprends toujours pas mon souci de memoire.

    Ma macro créer des objets dont les class sont définient dans l'application principale. Ces objets sont agréger dans mon appli. Certains objets sont détruits par la macro. Et d'autre objets sont créés par mon appli lors de l'execution de la macro. Je ne comprend pas pourquoi, si la macro fait un GC.Clean() ou fait un appel CleanGC() qui est une méthode de mon appli principal. Le garbage collector ne fait rien (si il prend un peu de memoire).

    Une fois la macro terminé. Je lance un GC.Clean via mon Appli prinicipal et là je gagne 400Mo en mémoire.

    J'ai peur en utilisant les domaines d'application que le souci persiste.
    Par contre je pourrai déchargé ma macro apres son execution, donc je vais tester de créer un domain d'application juste pour mes macros. je verrai bien le resultat

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 103
    Par défaut
    Donc j'ai réussi a créer mon domaine d'application spécialement pour mes macro.

    Question mémoire le GC.Collect ne marche toujours pas.
    Par contre la mémoire utilisé par l'appli est bie plus faible.

    Avant:
    Une fois la macro terminer, l'appli pesait 812Mo
    Apres un GC.Collect plus que 574Mo

    Maintenant:
    Une fois la macro terminer, l'appli pesait 560Mo
    Apres déchargement du nouveau domaine d'application 270Mo

    Le gain est énorme. Va comprendre!!! mais c mieux comme ca.
    Niveau perfo aucun changement.




    Nouveau soucis:
    Je suis obligé de déplacer ma dll créer dans le repertoire où se trouve l'exe de mon appli. C'est fortement gènant.


    Je résume:
    L'utilisateur créer un fichier texte qu'il nomme Test.cs
    L'appli le compile et créer un fichier Test.dll et un Test.pdb(en mode debug) au meme emplacement que Test.cs

    Je crée un nouveau domaine d'application "MacroDomain"

    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
     
    string myDirectory = Path.GetDirectoryName(iStrfile);   //iStrFile = "E:\\Macro\\Test.cs"
    AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
    setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;	
    setup.PrivateBinPath = 	myDirectory;
    setup.ApplicationName = "AppliMacro";
    setup.ShadowCopyFiles = "false";
     
    _DomainToLoad = AppDomain.CreateDomain("MacroDomain", null, setup);
     
    string myLocation = GetLoadedAssemblyLocation("AssemblyLoader");
    _Loader = (Loader)_DomainToLoad.CreateInstanceFromAndUnwrap(myLocation, "AssemblyLoader.Loader");
     
     
    _Loader .LoadFrom(outputFile);      //outputFile = "E:\\Macro\\Test.dll"

    _Loader est exactement la class AssemblyLoader que l'on trouve dans le tuto sur les aplplication patchable.
    Juste une méthode en plus LoadFrom qui utilise Assembly.LoadFrom(...) à la place de Assembly.Load(...)


    jusque là tout va bien


    ensuite je tente d'executer ma macro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    object myObj = _Loader.CreateInstanceOf(0, "Commandes");
    IScript myScript = (IScript)myObj;
     
    if(null != myScript)
    {
    myScript.Run(iRootProject, iMainWindows, iDlg);
    }

    Le crash arrive sur cette méthode: _Loader.CreateInstanceOf(0, "Commandes");

    Si le fichier Test.dll n'est pas dans le repertoire ou se trouve l'exe de mon appli
    voici le message d'erreur




    Je ne sais pas d'ou ca vient.
    Manque t-il un chemin dans la création de mon domaine?
    Est ce une option de compilation qui n'est pas correct qd je compile Test.cs?


    Dans la méthode _Loader.CreateInstanceOf
    du coup j'affiche l'emplacement de l'assembly qui bien "E:\\Macro\\Test.dll"
    j'affiche aussi les type exporté (GetExportedTypes): ici y en a qu'un et c'est bien "commandes"

    Je ne sais plus quoi faire?

    Qu'est ce que ca va etre qd je vais attaque le debugger

  4. #4
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Y'a très clairement un problème au niveau du chargement de ton assembly.

    * T'as essayé de lister tous les types présents dans ton assembly pour voir si ton type "Commande" est bien dedans ?

    * Essaye de changer la version de ton assembly (0.0.0.0 c'est chelou quand même ), histoire de voir si il te sort le bon numéro de version quand l'erreur se produit.

    * Y'a d'autres méthodes pour instancier un Type, genre Activator.CreateInstance, mais j'ai jamais essayé dans un AppDomain à part.

    Dsl, c'est pas des solutions, mais des pistes pour diagnostiquer le pb

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 103
    Par défaut
    Quand je demande les types de mon assembly, il me revoi bien un seul type qui est bien "commandes".

    Sinon, j'ai essayer de créer ma dll dans un nouveau repertoire "\Plugins\" qui se trouve dans le repertoire de mon appli. Et la ca marche. Par contre si je suis ailleur, le probleme reviens.


    Je vais tenter de changer le numéro d'assembly, pour voir.
    Et je me renseigne sur Activator.CreateInstance


    Ce que je ne comprend pas, c'est que si je ne créer pas de nouveau domaine et que je charge ma dll dans le domaine principal, aucun souci.



    Désolé j'ai recréer un nouveau topic "Utilisation des AppDomain" qui pour moi est plus parlant que "Revision sur Processus...."

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 103
    Par défaut
    Je viens d'essayer en ajoutant un numero de version.
    Meme souci.
    Le numero de version s'affiche bien dans le message d'erreur.

    J'ai essayer avec Activator.CreateInstance
    Pas mieux.

    Voici l'erreur renvoyer en utilisant l'Activator

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/12/2005, 04h28
  2. Réponses: 6
    Dernier message: 08/11/2005, 15h30
  3. [referencement] Référencer un site sur 2 domaines ?
    Par dorian53 dans le forum Référencement
    Réponses: 2
    Dernier message: 29/10/2005, 23h39
  4. [Blog] Les Blogs sur son Domaine ?
    Par Franck.H dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 23/09/2005, 10h58

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