Вопрос по uninstall, gac, c# – Удалить из GAC в коде C #

12

Как мне удалить GAC из моего приложения C #.

Я не могу удалить, конкретный EXE и DLL из GAC.

Это правильный способ удалить GAC в 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;
}
Увидетьstackoverflow.com/a/2611435/17034 Hans Passant
вы бы отменили его регистрацию по классу Process? Talha
Ссылка выше для & quot; исходного кода C #: программное добавление и удаление сборок из GAC (без использования GACUTIL) & quot; сейчас мертв. Вы можете найти сообщение на archive.org--C# Source Code: Programmatically adding and removing assemblies from the GAC (without using GACUTIL) Jim
Вы также можете сделать это вручную, перейдя в C: \ Windows \ assembly и & quot; удаление & quot; сборки, которые вы хотите удалить, если вы на самом деле не нуждаетесь в программном удалении. TheXenocide

Ваш Ответ

7   ответов
1

GAC - это глобальный кэш сборок, в основном это системная папка, в которой находятся общие библиотеки вашего компьютера.

Если вы все равно хотите удалить сборку, проверьте документацию gacutil здесь: http://msdn.microsoft.com/en-us/library/ex0ss12c(v=vs.71).aspx Но он будет удален для всех ваших проектов!

0

мации о том, как это можно сделать программно (хотя лицензия на ссылочный сайт ограничит вас от использования его в вашем программном обеспечении, т.е. копирование этого кода не является хорошей идеей).

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

(прокрутите вниз до публичного bool GacUnInstall (string assemblyName))

Смотрите также IAssemblyCache

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

и нативные методы для GetAssemblyCache

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

С другой стороны, поскольку код находится в сборке System.Web, а класс помечен как внутренний, для доступа к нему можно использовать отражение. Увидеть

Как получить доступ к внутреннему классу, используя Reflection

0

Вот решение из статьи поддержки Microsoft: http://support.microsoft.com/kb/815808

Другая ссылка (регистрация, отмена регистрации библиотек в GAC): http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/7d3165cf-ca3b-43cc-8f77-a46dbf38f13d/

Проблема в том, что удаление не происходит.
Ссылка msdn содержит код для установки и удаления.
0

что-то упустил?

1

так как это может вызвать проблемы у других приложений, использующих эту DLL. Но я предполагаю, что это ваше собственное, так что это относительно безопасно.

Используйте следующий код, чтобы удалить DLL из вашего GAC. Имя ассемблера - это имя вашей dll без расширения.

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;
}
Gacutil.exe предназначен только для разработки и не должен использоваться для установки производственных сборок в глобальный кэш сборок. Смотрите MSDN для болееmsdn.microsoft.com/en-us/library/dkkx7f79(v=vs.110).aspx
Вопрос был не в том, как установить сборки в GAC, а в том, как их удалить.
2

что библиотеки DLL находятся в том же каталоге, из которого выполняется этот код, попробуйте:

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

Надеюсь, это поможет кому-то ...

1

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;

} 
} 

Вы также можете загрузить файл сборки с помощью метода LoadFrom () класса Assembly, но его нецелесообразно использовать, вы можете прочитать пост здесь, чтобы узнать причины.

Как только у нас есть assemblyFullPath, легко удалить / удалить сборку из GAC. Пространство имен System.EnterpriseServices.Internal предоставляет методы для установки или удаления файлов GAC. Для установки / удаления файлов выполните следующие шаги:

Add reference to System.EnterpriseServices.dll in your project. Add using System.EnterpriseServices.Internal; at the end of the using's section.

Now with the assemblyFullPath, add the below lines of code in your method where you want to remove the assembly files.

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

Надеюсь, это поможет вам

Похожие вопросы