Подтвердить что ты не робот

Удаление из GAC В коде С#

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

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

Это правильный способ удаления GAC на С#?

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;
}
4b9b3361

Ответ 1

Предполагая, что библиотеки 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 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);
}

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

Ответ 2

Почему вы хотите это сделать? GAC - это глобальный кэш сборок, в основном это системная папка, содержащая общие DLL файлы вашего ПК.

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

Ответ 3

Выполните следующие действия: -

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. Выполните следующие действия для установки/удаления файлов:

  • Добавьте ссылку на System.EnterpriseServices.dll в своем проекте.
  • Добавить с помощью System.EnterpriseServices.Internal; в конце раздела использования.
  • Теперь с помощью assemblyFullPath добавьте следующие строки кода в свой метод, где вы хотите удалить файлы сборки.

    Опубликовать publishProcess = new Опубликовать(); publishProcess.GacRemove(assemblyFullPath);

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

Ответ 4

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

Используйте следующий код, чтобы удалить DLL из вашего GAC. Имя asssembly - это имя вашей 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;
}

Ответ 6

Почему бы вам просто не называть "gacutil/u" из приложения? Или я что-то упускаю?

Ответ 7

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

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