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 :

Deux exécutable, une DLL: sera-t-elle chargée une seule fois?


Sujet :

Framework .NET

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Deux exécutable, une DLL: sera-t-elle chargée une seule fois?
    Bonjour à tous,

    Le titre est explicite, je m'interroge sur comment le chargement d'une même DLL entre deux exécutable est géré sous .NET.

    Concrètement, j'ai deux exécutable dans un répertoire AppA.exe et AppB.exe. Ces deux exécutable utilisent une librairie gourmande quant à l'utilisation de la mémorie: Lib.dll. Étant donné que AppA et AppB fonctionnent dans un environement limité (un PDA) l'utilisation de la mémoire doit être optimal.

    Donc, ma question est: Est-ce que ladite DLL sera chargée une seule fois pour les 2 exécutables ou si elle sera chargée deux fois en mémoire (soit une fois pour chaque exécutable)?

    En Win32, à moins que je me gourre, la DLL sera chargée qu'une seule fois (indépendament de sa location et de sa version) et c'est justement cela qui, selon wikipedia, a donné naissance à l'expression `DLL Hell`.

    Je connais l'existance de la GAC, mais j'essais de l'évité autant que possible, étant donnée qu'elle occasionne une complexité pour le déploiement des applications qui serait facilement évitable. De plus, ladite librairie dépend sur plusieurs autres DLLs propriétaires dont je ne possède pas le code source et qui n'ont pas nécessairement de `Strong Name`.

    J'ai cherché sur le web et sur le forum, mais sans succès. Donc, votre aide sera très appréciée .

    Ah de plus, si vous avez une idée sur comment je pourrais découvrir la réponse par moi-même ce sera tout autant apprécié Pour l'instant j'essais de créer un projet bidon avec une giga librairie et observé l'utilisation de la mémoire, mais c'est c'est pas génial .

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Je n'ai pas de réponse 100% sûre, mais a priori je dirais que, vu que tes 2 exe tournent dans 2 AppDomain différents, la DLL est chargée deux fois : une fois par AppDomain. Cela dit, il est possible que le CLR gère ce genre de cas et ne charge en fait l'assembly qu'une seule fois pour optimiser... surtout sur le compact framework où la mémoire est une contrainte importante.

    Un moyen simple de le savoir serait de mesurer la mémoire utilisée quand chacune de tes applis tourne seule, et la mémoire utilisée quand elles tournent ensemble.

    Sinon tu peux essayer dee poser la question sur les forums MSDN, avec un peu de chance un grand gourou te répondra

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Un moyen simple de le savoir serait de mesurer la mémoire utilisée quand chacune de tes applis tourne seule, et la mémoire utilisée quand elles tournent ensemble.
    En fait je me demandais... si ladite librairie est chargée une seule fois, est-ce que la mémoire nécessaire au code de la librairie sera assigné au premier process ou si elle sera assignée à la "machine virtuelle" de .NET?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par scadieux Voir le message
    En fait je me demandais... si ladite librairie est chargée une seule fois, est-ce que la mémoire nécessaire au code de la librairie sera assigné au premier process ou si elle sera assignée à la "machine virtuelle" de .NET?
    Le CLR n'est pas un process, donc c'est l'application elle-même qui utilise la mémoire

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je vois... merci

    Sinon de mon côté je suis tombé sur ce lien magique:
    http://blogs.msdn.com/stevenpr/archi...05/347353.aspx

    J'apporte votre attention à cette section de l'article:
    http://blogs.msdn.com/stevenpr/archi...x#_Toc92680339

    Dans laquelle on nous explique:
    The file specified in the reference is loaded and its friendly name extracted. If a weakly named assembly with that friendly name has already been loaded, that assembly is considered to satisfy the reference and the assembly identified by the path-based reference is discarded. Said differently, only one assembly of a given identity may be loaded at a time.
    Cependant ils nous indique ceci au début de la section:
    Path-based references are specified by calls to Assembly.LoadFrom, AppDomain.ExecuteAssembly, or Assembly.Load (when called with the codebase property set in the AssemblyName).
    Étant donné que les assemblies ne sont pas chargé à l'aide de ces méthodes j'ai un doute quant au fait que mes assemblies sont chargée qu'une seule fois. Néanmoins c'est un pas dans la bonne direction (j'imagine...).

    Sinon, pour retourner à la GAC, j'ai fini par être capable de tout signer, la librairie non-signée était en fait un sample de code fournit par Microsoft pour la localisation GPS. Alors j'ai téléchargé les sources corriger 2-3 de leur bogues et recompiler le tout en signant mon assembly. Cependant, je crois que j'ai un peut de misère avec le concept de la GAC sous Windows Mobile.

    J'ai créer un fichier .gac dans lequel je réfère aux DLLs (lesquelles sont situées dans un répertoire différent de celui de l'application) que j'ai déposé dans le dossier Windows. Cependant mon application m'indique qu'elle ne réussit pas à trouver l'assembly.

    Effectivement aucune fichier GAC_... n'a été créé pour ma librairie dans le dossier Windows. Donc pas étonnant que l'assembly ne soit pas trouvé...

    C'est pas clair tout ce processus de GAC...

  6. #6
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Heu ... un fichier .gac ?

    Ce n'est pas gacutil qu'il faut utiliser pour enregistrer une dll dans le gac ? (pas sur vu que Windows CE et moi ...).

  7. #7
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Salut.

    L'extrait de la msdn parle (sauf erreur de ma part) du chargement d'une même librairie dans un même domain d'application. Or le lancement de deux exécutable crée 2 app domain (un par process). Dans ton cas la librairie sera bien chargée 2 fois. D'ailleurs ce comportement est normal, si la librairie n'était chargée q'une fois et partagée entre les applications, alors les données qu'elle manipule (et à plus bas niveau, la mémoire) serait partagée entre les applications. Or sauf exemple prouvant le contraire, si tu lances 2 applications utilisant une même librairie qui définie une variable statique, les deux applications peuvent faire varier cette variable de manière indépendante.

    D'autre part comme le dit Smyley, le GAC n'est pas un fichier mais bien un "container" dont l'outil de manipulation est gacutil
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    En ce qui concerne le fichier .gac, je vous redirige vers la msdn: http://msdn.microsoft.com/en-us/library/kw5x2w30.aspx.

    Pour l'application domain, je ne suis pas sûr à 100%, mais ce que contient l'Application Domain n'est pas seulement les variables dynamiques et statiques?

    Ce que je veux dire, c'est est-ce que l'algorithme alentour de ces variables n'est pas chargé qu'une seule fois?

    Je suis pas très callé côté bas niveau, alors je dis p-e des conneries

  9. #9
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par scadieux Voir le message
    En ce qui concerne le fichier .gac, je vous redirige vers la msdn: http://msdn.microsoft.com/en-us/library/kw5x2w30.aspx.
    Ok autant pour ma culture

    Citation Envoyé par scadieux Voir le message
    Pour l'application domain, je ne suis pas sûr à 100%, mais ce que contient l'Application Domain n'est pas seulement les variables dynamiques et statiques?
    Non, l'app domain géré également les assemblies utilisés par les applications. C'est d'ailleur un des moyens permettant d'isoler une assembly dans lequelle on n'a pas confiance.

    Ce que je veux dire, c'est est-ce que l'algorithme alentour de ces variables n'est pas chargé qu'une seule fois?

    De toute façon, généralement, ce ne sont pas les algo qui prennent de la place mais bien les données stockées par les algos
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

Discussions similaires

  1. [DLL] Afficher le contenu d'une dll dans un Tpanel
    Par Fabs dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/08/2007, 14h30
  2. Charge une DLL dynamiquement
    Par K.othmane dans le forum Delphi
    Réponses: 8
    Dernier message: 30/07/2006, 22h48
  3. Réponses: 4
    Dernier message: 03/11/2005, 13h57
  4. [MFC][DLL]Dialog Avec ActiveX dans une DLL ?
    Par matazz dans le forum MFC
    Réponses: 1
    Dernier message: 16/05/2005, 16h36
  5. Réponses: 9
    Dernier message: 29/03/2005, 09h36

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