System.EnterpriseServices.Internal.Publish.GacInstall не работает, но без ошибок

Вот мой код:

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


person sirdank    schedule 02.12.2015    source источник


Ответы (3)


Вы уже пришли к выводу, что эти методы не всегда полезны.

Если вам нужен более надежный метод, вы можете сделать это из C#, используя GAC/Fusion API, задокументированный здесь и здесь. Пример на C# можно найти здесь (спасибо Хансу Пассанту), здесь или здесь.

Вы также можете попробовать gacutil.exe, чтобы узнать, в чем проблема. Вы можете найти его на своем компьютере с установленной Visual Studio.

person Lars Truijens    schedule 02.12.2015

Оказалось, что это Installshield. Версия 6 сборок EnterpriseLibrary предназначена для .NET 4.0, и, поскольку Installshield создает только 32-разрядные .exe, она вызывала .NET 2.0 System.EnterpriseServices.dll, которая не могла зарегистрировать сборки .NET 4.0 EnterpriseLibrary. Я добавил пользовательский инструмент C# для публикации сборок, вызываемых через скрипт установки. Это уродливо, но это придется сделать, пока мы не сможем перейти на WIX.

person sirdank    schedule 02.12.2015

У меня была аналогичная проблема сегодня; машина перезагрузилась. Я открыл Powershell ISE в режиме без прав администратора, запустил тот же сценарий, который я запускал сотни раз, и он работал так, как будто работал, но это не так. Проблема была в том, чтобы открыть от имени администратора.

person NealWalters    schedule 18.10.2019