2012-06-20 20 views
12

¿Cómo desinstalo el GAC de mi aplicación de C#.Desinstalar de GAC En el código de C#

No puedo desinstalar, el archivo ejecutable y DLL particular de GAC.

¿Es la forma correcta de desinstalar el GAC en C#?

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

¿considerarías anular el registro por clase de proceso? – Talha

+8

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

+3

["Código fuente de C#: agregación y eliminación mediante programación de ensamblados del GAC (sin usar GACUTIL)"] (http://www.vbusers.com/codecsharp/ codeget.asp? ThreadID = 65 & PostID = 1) –

Respuesta

1

¿Por qué quieres hacer eso? GAC es la memoria caché de ensamblaje global, básicamente es la carpeta del sistema que contiene las DLL compartidas de su PC.

Si desea eliminar el conjunto de todos modos, consulte la documentación de gacutil aquí: http://msdn.microsoft.com/en-us/library/ex0ss12c(v=vs.71).aspx ¡Pero se eliminará para todos sus proyectos!

1

seguir los siguientes pasos: -

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; 

} 
} 

También puede cargar el archivo de ensamblaje con el método() de la clase de ensamblado LoadFrom pero no es bueno para usarlo, puede leer el post clicpara las razones.

Una vez que tenemos el assemblyFullPath, es fácil desinstalar/eliminar el ensamblaje de GAC. El espacio de nombres System.EnterpriseServices.Internal proporciona métodos para instalar o eliminar archivos GAC. Siga los pasos a continuación para instalar/eliminar los archivos:

  1. Agregue referencia a System.EnterpriseServices.dll en su proyecto.
  2. Agregar usando System.EnterpriseServices.Internal; al final de la sección de uso.
  3. Ahora con el assemblyFullPath, agregue las siguientes líneas de código en su método donde desea eliminar los archivos de ensamblaje.

    Publicar publishProcess = new Publish(); publishProcess.GacRemove (assemblyFullPath);

espero que le ayudará a

0

Cómo instalar un ensamblado en la caché de ensamblados global en Visual C#:

Aquí está la solución de artículo de soporte de Microsoft: http://support.microsoft.com/kb/815808

Otro enlace (registro, anulación del registro de bibliotecas de GAC): http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/7d3165cf-ca3b-43cc-8f77-a46dbf38f13d/

+0

El problema se trata de que no se haya desinstalado. –

+0

El enlace msdn tiene código para instalar y desinstalar. –

0

¿Por qué no llamas a "gacutil/u" desde la aplicación? ¿O me estoy perdiendo algo?

1

Se recomienda no hacerlo, ya que puede causar problemas a otras aplicaciones que usen esa DLL. Pero supongo que es tuyo, por lo que es relativamente seguro.

Utilice el siguiente código para eliminar el dll de su GAC. El nombre del ensamblador es el nombre de su dll sin la extensión.

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 es solo para fines de desarrollo y no se debe utilizar para instalar ensamblajes de producción en la caché de ensamblados global. Consulte MSDN para obtener más información http://msdn.microsoft.com/en-us/library/dkkx7f79(v=vs.110).aspx – bartonm

+0

La pregunta no era cómo instalar ensamblajes en el GAC, sino cómo eliminarlos. –

2

Suponiendo que los archivos DLL se encuentran en el mismo directorio que en el código se está ejecutando desde, intente:

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); 
} 

Espero que esto ayude a alguien ...

0

Se puede ver la referencia de .NET codifique los detalles sobre cómo puede hacerlo programáticamente (aunque la licencia del sitio de referencia le impedirá usarlo en su propio software, es decir, copiar y pegar este código no es una buena idea).

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

(desplácese hacia abajo para GacUnInstall public bool (assemblyName cadena))

Ver también IAssemblyCache

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

y los métodos nativos para GetAssemblyCache

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

Por otro lado, como el código está en ensamblado System.Web y la clase está marcada como interna, puede usar la reflexión para acceder a ella. Ver

How to access internal class using Reflection

Cuestiones relacionadas