Вот мой код:
var s = new System.EnterpriseServices.Internal.Publish();
foreach (string file in Directory.EnumerateFiles(@"C:\Program Files\MyFolder\MSPractices"))
{
Console.WriteLine("GACing " + file);
s.GacInstall(file);
}
Это файлы, которые я пытаюсь получить в GAC (версия 6.0.1304.0)
Microsoft.Practices.EnterpriseLibrary.Caching.dll Microsoft.Practices.EnterpriseLibrary.Common.dll Microsoft.Practices.EnterpriseLibrary.Data.dll Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.dll Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll Microsoft.Practices .EnterpriseLibrary.Logging.Database.dll Microsoft.Practices.EnterpriseLibrary.Logging.dll Microsoft.Practices.EnterpriseLibrary.PolicyInjection.dll Microsoft.Practices.EnterpriseLibrary.Security.dll Microsoft.Practices.EnterpriseLibrary.Validation.dll Microsoft.Practices.ServiceLocation. dll Microsoft.Practices.Unity.Configuration.dll Microsoft.Practices.Unity.dll Microsoft.Practices.Unity.Interception.Configuration.dll Microsoft.Practices.Unity.Interception.dll
Их дал мне кто-то другой, поэтому я не знаю, где их можно достать, но наверняка они доступны в Интернете.
Код правильно выводит этот список и не выдает никаких исключений, но запуск gacutil /l
показывает, что на самом деле установлены лишь некоторые из них (выделены ниже).
Что может пойти не так?
ВОЗМОЖНО ВАЖНО: Моя реальная проблема заключается в том, что это не работает в моем установщике InstallShield InstallScript с аналогичным кодом (с использованием объекта EnterpriseServices.Internal.Publish).
Этот метод не вызывает исключений! ...для всего!
Publish pub = new Publish(); pub.GacInstall("foo");
Нет ошибки, нет исключения. Если путь действителен, а сборка имеет строгое имя, она будет правильно установлена в GAC. Работает для целевой версии сборки .NET Frame. т.е. приложение .NET Framework 4.0, использующее GacInstall, правильно установит целевую сборку 3.5 и т. д.
Обновление (13.12.2011). После использования ILSpy для просмотра кода этой функции я обнаружил, что ошибки отправляются в средство просмотра событий на локальном компьютере:
К сожалению, все события в окне просмотра событий говорят только
Установка в глобальный кеш сборки не удалась: foo