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 :

[GAC]Erreur lors de la tentative de désinstallation d'une assembly du gac


Sujet :

Framework .NET

  1. #1
    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 [GAC]Erreur lors de la tentative de désinstallation d'une assembly du gac


    Je voudrais pouvoir installer/désinstaller des assemblies dynamquement dans le GAC. Pour ce qui est de l'installation, elle marche nikel avec ceci :
    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
     
    public void AddtoGAC()
            {
                // Get the assembly location
                string location = GetAssembly().Location;
                // Get the assembly cache interface.
                IAssemblyCache assemblyCache = null;
                int hr = CreateAssemblyCache(out assemblyCache, 0);
                if (0 != hr)
                    throw new ApplicationException("Failed to get AssemblyCache interface!");
                // Install the assembly
                hr = assemblyCache.InstallAssembly(0, location, (IntPtr)0);
                if (0 != hr)
                    throw new ApplicationException("Failed to add this assembly to the GAC!");
            }
    IAssemblyCache correspondant à l'interface vers Fusion.dll :
    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
     
    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("e707dcde-d1cd-11d2-bab9-00c04f8eceae")]
        internal interface IAssemblyCache
        {
            ///
            [PreserveSig()]
            int UninstallAssembly(uint dwFlags, [MarshalAs(UnmanagedType.LPWStr)] string pszAssemblyName, IntPtr pvReserved, out uint pulDisposition);
            [PreserveSig()]
            int QueryAssemblyInfo(uint dwFlags, [MarshalAs(UnmanagedType.LPWStr)] string pszAssemblyName, IntPtr pAsmInfo);
            [PreserveSig()]
            int CreateAssemblyCacheItem(uint dwFlags, IntPtr pvReserved, out /*IAssemblyCacheItem*/IntPtr ppAsmItem, [MarshalAs(UnmanagedType.LPWStr)] String pszAssemblyName);
            [PreserveSig()]
            int CreateAssemblyScavenger(out object ppAsmScavenger);
            [PreserveSig()]
            int InstallAssembly(uint dwFlags, [MarshalAs(UnmanagedType.LPWStr)] string pszManifestFilePath, IntPtr pvReserved);
        }
    Mais mon problème est que la désinstallation échoue toujours à partir de mon programme ( bien que je puisse désinstaller l'assembly à partir du shell de Windows ) avec une erreur IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED bien que cette assembly soit toujours listée dans le shell .
    Pour la désinstaller j'utilise ce code :
    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
    20
    21
    22
     
    public void RemoveFromGAC()
            {
                // Get the full assembly name
                string fullName = GetAssembly().FullName;
                // Get the assembly cache interface.
                IAssemblyCache assemblyCache = null;
                int hr = CreateAssemblyCache(out assemblyCache, 0);
                if (0 != hr)
                    throw new ApplicationException("Failed to get AssemblyCache interface!");
                // Remove the assembly
                uint n = 0;
                hr = assemblyCache.UninstallAssembly(0, fullName, (IntPtr)0, out n);
                if (0 != hr)
                {
                    IASSEMBLYCACHE_UNINSTAL_ID id = IASSEMBLYCACHE_UNINSTAL_ID.Unknown;
                    if (Enum.IsDefined(typeof(IASSEMBLYCACHE_UNINSTAL_ID), n))
                        id = (IASSEMBLYCACHE_UNINSTAL_ID)n;
     
                    throw new ApplicationException(String.Format("Failed to remove this assembly from the GAC!\nError : {0}",id));
                }
            }
    Je voudrais donc savoir quel sont les causes possibles d'une érreur IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED, ou encore, comment je pourrai parvenir à installer/désinstaller l'assembly du GAC, sans utiliser GacUtil.exe ... auriez - vous une idée ?

    Cdl
    Smyley

  2. #2
    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.
    pourquoi ne pas passer tout simplement par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Process.Start("gacutil.exe")
    ...
    il te suffit de copier gacutil avec ton app pour etre sure que ça marche.

  3. #3
    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
    Ben ce n'est pas aussi élégant
    En plus, celà revient à inclure gacutil.exe dans mon installeur et devoir l'extraire pendant l'installation et le supprimer après ...

  4. #4
    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 smyley
    Ben ce n'est pas aussi élégant
    Oui mais c'est la seule méthode universelle

    Citation Envoyé par smyley
    En plus, celà revient à inclure gacutil.exe dans mon installeur et devoir l'extraire pendant l'installation et le supprimer après ...
    Vu la taille de gacutil.exe et gacutil.exe.config c'est pas un pb je pense

  5. #5
    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
    bon ben c'est partit

    Merci

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/06/2015, 14h22
  2. Erreur lors de la tentative de suppression d'enregistrement
    Par santana2006 dans le forum Requêtes
    Réponses: 0
    Dernier message: 17/02/2010, 13h02
  3. Erreur lors de l'extraction de données dans une base Mysql5
    Par Klemsy78 dans le forum Bases de données
    Réponses: 10
    Dernier message: 26/01/2010, 14h18
  4. Réponses: 1
    Dernier message: 07/11/2006, 10h33
  5. Réponses: 10
    Dernier message: 24/08/2006, 20h52

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