2012-06-20 8 views
12

Wie deinstalliere ich den GAC aus meiner C# -Anwendung.Deinstallieren von GAC In C# -Code

Ich bin nicht in der Lage, die bestimmte exe und DLL von GAC zu deinstallieren.

Ist es der richtige Weg, den GAC in C# zu deinstallieren?

public void RemoveAssembly(string ShortAssemblyName, string PublicToken) 
{ 
    AssemblyCacheEnum AssembCache = new AssemblyCacheEnum(null); 

    string FullAssembName = null; 

    for (; ;) 
    { 
     string AssembNameLoc = AssembCache.GetNextAssembly(); 
     if (AssembNameLoc == null) 
      break; 

     string Pt; 
     string ShortName = GetAssemblyShortName(AssembNameLoc, out Pt); 

     if (ShortAssemblyName == ShortName) 
     { 

      if (PublicToken != null) 
      { 
       PublicToken = PublicToken.Trim().ToLower(); 
       if (Pt == null) 
       { 
        FullAssembName = AssembNameLoc; 
        break; 
       } 

       Pt = Pt.ToLower().Trim(); 

       if (PublicToken == Pt) 
       { 
        FullAssembName = AssembNameLoc; 
        break; 
       } 
      } 
      else 
      { 
       FullAssembName = AssembNameLoc; 
       break; 
      } 
     } 
    } 

    string Stoken = "null"; 
    if (PublicToken != null) 
    { 
     Stoken = PublicToken; 
    } 

    if (FullAssembName == null) 
     throw new Exception("Assembly=" + ShortAssemblyName + ",PublicToken=" + 
     token + " not found in GAC"); 

    AssemblyCacheUninstallDisposition UninstDisp; 


    AssemblyCache.UninstallAssembly(FullAssembName, null, out UninstDisp); 
} 


public static void UninstallAssembly(String assemblyName, InstallReference reference, out AssemblyCacheUninstallDisposition disp) 
{ 
    AssemblyCacheUninstallDisposition dispResult = AssemblyCacheUninstallDisposition.Uninstalled; 
    if (reference != null) 
    { 
     if (!InstallReferenceGuid.IsValidGuidScheme(reference.GuidScheme)) 
      throw new ArgumentException("Invalid reference guid.", "guid"); 
    } 

    IAssemblyCache ac = null; 

    int hr = Utils.CreateAssemblyCache(out ac, 0); 
    if (hr >= 0) 
    { 
     hr = ac.UninstallAssembly(0, assemblyName, reference, out dispResult); 
    } 

    if (hr < 0) 
    { 
     Marshal.ThrowExceptionForHR(hr); 
    } 

    disp = dispResult; 
} 
+0

Möchten Sie die Registrierung durch die Process-Klasse aufheben? – Talha

+8

Siehe http://stackoverflow.com/a/2611435/17034 –

+3

["C# Source Code: Programmgesteuertes Hinzufügen und Entfernen von Baugruppen aus dem GAC (ohne Verwendung von GACUTIL)"] (http://www.vbusers.com/codecsharp/ codeget.asp? ThreadID = 65 & PostID = 1) –

Antwort

1

Warum möchten Sie das tun? GAC ist der Global Assembly Cache, im Wesentlichen der Systemordner, der die freigegebenen DLLs Ihres PCs enthält.

Wenn Sie die Baugruppe trotzdem entfernen möchten, überprüfen Sie die gacutil Dokumentation hier: http://msdn.microsoft.com/en-us/library/ex0ss12c(v=vs.71).aspx Aber es wird für alle Ihre Projekte entfernt werden!

1

Folgen Sie diese Schritte: -

using System; 
using System.Reflection; 
private string assemblyFullPath = ""; 
public class myAssembly 
{ 
static void Main() 
{ 
Assembly assembly = Assembly.Load("library, version=1.0.0.0, culture=neutral, PublicKeyToken=9b184fc90fb9648d"); 
assemblyFullPath = assembly.Location; 

} 
} 

Sie können auch die Baugruppendatei mit Loadfrom() -Methode der Assembly-Klasse laden, aber es ist nicht gut, es zu benutzen, können Sie den Beitrag lesen Sie die Gründe hierzu wissen.

Sobald wir die AssemblyFullPath haben, ist es einfach, die Assembly von GAC zu deinstallieren/zu entfernen. Der Namespace System.EnterpriseServices.Internal bietet Methoden zum Installieren oder Entfernen von GAC-Dateien. Befolgen Sie die folgenden Schritte, um die Dateien zu installieren/zu entfernen:

  1. Fügen Sie einen Verweis auf System.EnterpriseServices.dll in Ihrem Projekt hinzu.
  2. Hinzufügen mit System.EnterpriseServices.Internal; am Ende des Verwendungsbereichs.
  3. Fügen Sie jetzt mit dem AssemblyFullPath die folgenden Codezeilen in der Methode hinzu, in der Sie die Assemblydateien entfernen möchten.

    Veröffentlichen publishProcess = new Publish(); publishProcess.GacRemove (assemblyFullPath);

hoffen, dass es Ihnen helfen,

0

Wie eine Assembly in den Global Assembly Cache in Visual C# zu installieren:

Hier ist die Lösung von Microsoft Support-Artikel ist: http://support.microsoft.com/kb/815808

Ein weiterer Link (Registrierung, Aufhebung der Registrierung von Bibliotheken von GAC): http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/7d3165cf-ca3b-43cc-8f77-a46dbf38f13d/

+0

Das Problem besteht darin, das Unistalling nicht zu installieren. –

+0

Der MSDN-Link enthält Code für die Installation und Deinstallation. –

0

Warum rufst du nicht einfach "gacutil/u" aus der Anwendung? Oder fehlt mir etwas?

1

Es wird empfohlen, dies nicht zu tun, da dies Probleme bei anderen Anwendungen verursachen kann, die diese DLL verwenden. Aber ich nehme an, es ist deine eigene, also ist es relativ sicher.

Verwenden Sie den nächsten Code, um die DLL aus Ihrem GAC zu entfernen. Der assembly name ist der Name Ihrer DLL ohne die Erweiterung.

public static void UninstallAssembly(string assemblyName) { 
    ProcessStartInfo processStartInfo = new ProcessStartInfo("gacutil.exe", 
     string.Format("/u {0}.dll", assemblyName)); 

    processStartInfo.UseShellExecute = false; 
    Process process = Process.Start(processStartInfo); 
    process.WaitForExit; 
} 
+0

Gacutil.exe dient nur zu Entwicklungszwecken und sollte nicht zum Installieren von Produktionsassemblys im globalen Assemblycache verwendet werden. Weitere Informationen finden Sie unter MSDN http://msdn.microsoft.com/en-us/library/dkkx7f79(v=vs.110).aspx – bartonm

+0

Die Frage war nicht, wie Assemblys in den GAC installiert werden, sondern wie sie entfernt werden. –

2

die DLLs Unter der Annahme, im selben Verzeichnis wie wo dieser Code aus ausgeführt wird, versuchen:

ArrayList libraries = new ArrayList(); 
libraries.Add("somedll1.dll"); 
libraries.Add("somedll2.dll"); 

Console.WriteLine("Registering DDLs in the Gac"); 

try 
{ 
    for (int i = 0; i < libraries.Count; i++) 
    { 
     // get the path from the running exe, and remove the running exe's name from it 
     new System.EnterpriseServices.Internal.Publish().GacRemove(System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("ThisUtilitiesName.exe", "") + libraries[i]); 
    } 

    Console.WriteLine("Completed task successfully"); 
} 
catch (Exception exp) 
{ 
    Console.WriteLine(exp.Message); 
} 

hoffe, das hilft jemand ...

0

Sie können .NET Referenz sehen Code für Details, wie es programmgesteuert durchgeführt werden kann (obwohl die Lizenz für die Referenz-Site Sie davon abhält, es in Ihrer eigenen Software zu verwenden, dh Kopieren-Einfügen dieses Codes ist keine gute Idee).

http://referencesource.microsoft.com/#System.Web/xsp/system/Web/Configuration/GacUtil.cs

(nach unten scrollen, um public bool GacUnInstall (string assembly))

Siehe IAssemblyCache auch

http://referencesource.microsoft.com/#System.Web/xsp/system/Web/Configuration/IAssemblyCache.cs

und die nativen Methoden für GetAssemblyCache

http://referencesource.microsoft.com/#System.Web/xsp/system/Web/NativeMethods.cs

Da der Code jedoch in der Assembly System.Web liegt und die Klasse als intern markiert ist, können Sie über Reflection darauf zugreifen. Siehe

How to access internal class using Reflection