Удаление из 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;
}
Ответы
Ответ 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;
}
Ответ 5
Как установить сборку в глобальный кэш сборок в Visual С#:
Вот решение из статьи поддержки Microsoft:
http://support.microsoft.com/kb/815808
Другая ссылка (регистрация, отмена регистрации библиотек от GAC):
http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/7d3165cf-ca3b-43cc-8f77-a46dbf38f13d/
Ответ 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