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

Dotnet Discussion :

[1.1] Référencement de DLL / GAC


Sujet :

Dotnet

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut [1.1] Référencement de DLL / GAC
    Bonjour à tous.

    Voila j'ai plusieurs projets qui utilisent tous la même DLL.
    A chaque compilation pour le moment il y a une copie locale de la DLL.

    Ca m'embete

    J'aimerais que la DLL soit dans un répertoire et que toutes les applications puissent pointer vers ce répertoire MAIS je ne sais pas d'avance le répertoire car ca dépendra de la machine de Livraison.

    Comment faire ?

    pour le moment j'ai essayé de voir du côté du GAC, j'ai donc signé ma DLL puis j'ai fais un GacUtil.exe -I MaDll. Dans le répertoire C:\Windows\Assembly je retrouve bien ma DLL inscrite.

    Maintenant comment je fais avec mes projets pour leur dire de choper la DLL via le GAC ?

    merci d'avance.

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par SoaB
    Maintenant comment je fais avec mes projets pour leur dire de choper la DLL via le GAC ?

    merci d'avance.
    Sur tes projets, tu fais un clic droit => Ajouter une référence et là, dans le 1er onglet, tu devrais retrouver ta DLL

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    Hum ... non ^^

    Dans le 1er onglet des références .Net on retrouve pas les DLL du gac mais les DLL situées dans le répertoire du Framework.

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Bon alors tu ajoutes ta référence vers le fichier DLL, tu sélectionnes la références que tu viens d'ajouter et dans les propriétés, tu choisis "Copie Locale ?" et tu met sur "Non".

    Ensuite, tu as juste a exécuter l'application: elle devrait commencer par regarder dans le répertoire courant si elle trouve la DLL puis, si elle trouve pas, remonter dans la GAC


    A+

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    C'est ce que j'ai fais ... et ca ne marche pas :s

    Projet Lib => Compilation => C:\projets\Lib\Bin\Release

    Copie C:\projets\Lib\Bin\Release\Lib.DLL dans C:\projets\DllReference\
    GacUtil /i C:\projets\DllReference\Lib.dll

    Projet Main => Référence projet Lib => copie local à False.

    Je compile je lance c'est bon

    Je supprime les DLL généré par Projet Lib du répertoire C:\projets\Lib\Bin\Release
    ca ne marche plus.

    Ca veut dire qu'il allait quand meme chercher les DLL dans le répertoire du projet et non dans le GAC ou dans C:\Projet\DDlreference

    Je ne comprend pas.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Points : 62
    Points
    62
    Par défaut Problème de version...
    Le GAC (Global Assembly Cache) permet de mettre en visibilité une version d'un assembly...

    Pour une utilisation plus simple, vous devez figer la version de votre assembly (en 1.0.0.0 par exemple). Une fois ceci fait, vous recompiler votre programme avec cette version de votre assembly, puis vous supprimez votre assembly de votre répertoire lib.

    Cela devrait fonctionner sans problème.

    Cordialement

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    En figeant la version de l'assemblée ca l'air de fonctionner. je vais tenter une livraison afin de voir si cela passe.

    Merci :jap:

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Points : 62
    Points
    62
    Par défaut Gestion des versions...
    Si vous avez vraiment besoin de gérer les versions, il existe des policies applicables aux assemblies .Net...

    ==> Publisher policies

    Cordialement.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    Bon je ne comprend vraiment pas le GAC et les assemblées la ... je vois pas l'intérêt ...

    Je pensais que ca gérait le versionning ...

    Je fais une classe toute bete

    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
    using System;
     
    namespace LibGac
    {
    	/// <summary>
    	/// Description résumée de Class1.
    	/// </summary>
    	public class Tools
    	{
    		public static string GetMsg()
    		{
    			return "titi";
    		}
    	}
    }
    Je compile en 1.0.0.0.
    Et je fais un GacUtil /i de la DLL

    Ensuite je modifie GetMsg pour que la fonction renvoie "toto" à la place de "titi". Je compile en 1.0.1.0
    et Je fais un GacUtil /i de la DLL.

    dans C:\Windows\Assembly j'ai bien les 2 versions de ma Dll "LibGac"

    Maintenant j'ai un projet tout bete console qui appelle la fonction statique GetMsg pour afficher en Console.

    Comment faire pour spécifier la version à utiliser de la DLL ? car il m'affiche tout le temps "toto" et je ne sais pas faire un retour arrière.

    J'ai essayé de désinstaller la version 1.0.1.0 de C:\Windows\assembly mais il me fait "fichier introuvable".

    Faut il lors de l'install sur le GAC renommer les DLL avec une version précise puis de faire un GacUtil sur chaque DLL à chaque version ?
    Ne fait il pas de propre backup ?

    Je n'arrive pas à trouver une aide claire la dessus du moins des informations de "base", l'essentiel.

    Merci.

    EDIT 1 : Les publishers Policy correspondraient à ce que je dis concernant le renommage des DLL ?

    EDIT 2 :
    Ce n'est pas très clair mon but final je pense.
    En fait j'ai LIBGAC qui est une librairie commune, avec 2 version une qui affiche TITI l'autre TOTO.

    J'ai 2 à X applications qui appellent cette librairie mais des versions différentes.

    Dans un environnement de pre-prod, je veux livrer une DLL tester, et si ca marche pas enlever cette DLL pour qu'ils reprennent l'ancienne. Comment faire ca ?

    Je pensais que le GAC permettait à l'application de prendre la version la plus récente et si on efface la version la plus récente, bah la précédente devient celle choisie mais apparemment non. Sauf si, lors de l'inscription ds le GAC, on utiliser des DLL différentes (nom différent).

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Points : 62
    Points
    62
    Par défaut ... Gac ...
    En fait le GAC n'est pas prévu pour mettre à disposition la version la plus récente, mais TOUTES les versions d'une assembly.

    Votre programme, lorsque vous l'avez compilé, connait EN DUR le nom et la version complète de l'assembly qu'il doit utiliser.

    Pour rediriger votre programme vers la dll la plus récente, vous avez plusieurs choix:
    • une configuration dans un fichier app.config (uniquement valable pour le programme qui aura le fichier .config
    • une configuration dans le fichier machine.config (valable pour toute la machine, mais difficilement gérable)
    • un assembly de redirection "publisher policy" qui permet, dès sa mise dans le GAC, d'utiliser la version qu'il précise.

    Je vous conseillerai l'utilisation des publisher policies... un peu plus compliqué à mettre en place, mais hyper efficaces (c'est ce que je fais en runtime / prod / prè-prod / dev)

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    Merci de votre réponse, j'aimerais essayer les 2 possibilités (app.config & Publisher) afin de voir le plus avantageux.

    Je suis allé voir le lien MSDN mais je n'ai pas bien compris sa création, ca manque de précision je trouve.

    Quelqu'un aurait un tutorial ? car la recherche est fastidieuse, on tombe sur tout et n'importe quoi ...

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Points : 62
    Points
    62
    Par défaut Policies...
    Pour créer une policy de redirection, il vous faut créer un fichier de config comme ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <configuration>
        <runtime>
            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
                <dependentAssembly>
                    <assemblyIdentity name="LIBGAC" publicKeyToken="YourToken" />
                    <bindingRedirect oldVersion="1.0.0.0-1.0.0.7" newVersion="1.0.0.7"/>
                </dependentAssembly>
            </assemblyBinding>
        </runtime>
    </configuration>
    Ensuite, il vous faut appeler la ligne de commande suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    al /link:"VotreFichier.Config" /out:"Policy.1.0.LIBGAC.dll" /keyfile:c:\KeyFile\YourKey.snk /v:1.0.0.0
    Cordialement

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    Merci mais j'avais compris cela avec le lien, j'ai fais ma DLL.

    Mais c'est surtout ce qu'il y a autour car une fois que j'ai créé ma dll Policy.1.0.LIBGAC.dll j'en fais quoi ?

    C'est la DLL que je dois mettre dans le gac et référencé dans mon Projet ?
    et ensuite je dois recompiler ma Libgac, modifier le Config puis remettre la Policy.1.0.LibGac.dll dans le GAC ?

    Je ne comprend vraiment pas en quoi le GAC aide s'il ne permet pas de revenir à une ancienne version. Car si on désinstalle une version dans le GAC, il supprime le fichier DLL associé donc l'ancienne version dans le GAC ne marchera pas car le fichier n'est plus trouvé car apparemment ils pointent sur le meme :s

    En gros c'est de la DLLL encore une fois ... Quand on inscrit une DLL dans le GAC il ne fait pas une copie de la DLL dans un répertoire système en renommant la dll avec sa propre nomenclature ??

    Et notre projet point sur le nom de la DLL avec une version et il se démerde pour nous renvoyer la bonne dll ?

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    Je suis toujours avec ma problématique.
    Et j'ai clairement du mal à voir à l'intérêt du GAC ... à part créer un beau bordel de DLL comme à chaque fois avec les DLL ...

    Les policy c'est un bousin monstre et ca ne fait pas forcément ce que je veux.

    en fait c'est très simlpe ce que je recherche.
    On référence LibGac.DLL dans tous les projets.

    faire 2 DLL :
    - dev.Libgac.dll
    - prod.libgac.dll

    Et faire en sorte ds le web.config ou quelque part de dire à l'appli que la référence LibGac.dll pointe sur C:\Lib\Dev.libgac.dll ou C:\lib\Prod.Libgac.dll

    merci d'avance

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    Bon alors je continue mon monologue ...

    j'ai réussi à faire un BindingRedirect mais je comprend pas l'intérêt de cette méthode dans mon cas ....

    J'ai sur le même PC plusieurs applications consoles dans des répertoires différents

    Dev/
    Batch.exe
    ...
    Hom/
    Batch.exe
    ...

    Batch.exe est une application console faisant appel à une librairie "LibGac.dll"
    Sachant que j'ai plusieurs applications du meme genre, je n'ai pas envie de mettre "LibGac.dll" dans chaque répertoire de l'application et j'aimerais centraliser.

    Mais, même si Batch.exe utilise la même référence vers "LibGac.dll" j'aimerais qu'ils pointent sur des fichiers différents.

    Dev.LibGac.dll
    Hom.LibGac.dll

    Comment faire ca ? redirection de version j'ai pas vraiment trouvé l'intérêt de Policy pour mon cas.

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/03/2013, 17h00
  2. Référencement de dll et création de Code
    Par ezrider dans le forum C#
    Réponses: 0
    Dernier message: 19/03/2013, 16h19
  3. [Web.Config][DLL][GAC] BindingRedirect versioning
    Par SoaB dans le forum Framework .NET
    Réponses: 1
    Dernier message: 03/11/2011, 10h35
  4. [Versioning]Quels eclaircissements sur Dll/GAC/References?
    Par chnew dans le forum Framework .NET
    Réponses: 4
    Dernier message: 22/03/2006, 18h11

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