2010-09-27 4 views
1

Решение этой проблемы заключается в добавлении DLL в GAC, как это было предложено в одном из ответов на мою публикацию. Как я отметил в одном из моих ответов, gacutility не будет доступна в среде, где этот процесс должен быть запущен. Из-за этого простое решение гашировки не является вариантом. Чтобы решить эту проблему, я вывел Posh функцию, которая будет добавлять библиотеки DLL в GAC:Не удалось загрузить сборку или выполнить сборку. Решение

парам ([строка] $ DLLPath)

[строка] $ publicToken = $ нулевой [строка] $ Вэл = $ нулевой [строка] $ версия = $ нулевой

если (тест-путь) $ DLLPath) { $ baseFileName = [System.IO.Path] :: GetFileNameWithoutExtension ($ DLLPath) $ Имя_целевого_объекта = «C: \ Windows \ assembly \ GAV_MSIL \ "+ $ baseFileName

# Get the key and public token 
$val = sn -Tp $dllPath 

# Get the version w/o loading 
$version = [System.reflection.AssemblyName]::GetAssemblyName($dllPath).Version 

# Proceed if the token is valid 
if ($val -ne -null) 
{ 
    $vals = $val.split(" ") 
    $publicToken = $vals[$vals.length-1] 
    $targetNameSub=$targetName + "\" + $version + "__" + $publicToken 

    if (!(test-path $targetName)) 
    { 
     Md $targetName | Out-Null 
    } 

    Md $targetNameSub | Out-Null 

    # Copy the DLL to the GAC 
    copy-item $dllPath $targetNameSub | Out-Null 
} 

}

Я тестировал это, и он работает очень хорошо. В своем исследовании я нашел что-то, указывающее на то, что gacutility делает записи в реестре, которые я не делаю. Но эта функция работает очень хорошо.

Я попытался изменить процесс, чтобы придумать функцию Posh для удаления записей GAC, но я еще не успел каждый раз получать доступ, запрещенный при удалении DLL-файла.

+0

.NET сборки загрузка не использует PATH ENV вар. Он либо загружает его из базового каталога приложения (как вы видели при копировании dll в базовый каталог PowerShell), либо он загружает его из GAC, как предлагает @critobalito. У вас есть несколько вариантов для изменения этого поведения. Вы можете добавить пробный каталог (см. Эту статью http://msdn.microsoft.com/en-us/library/15hyw9x3(VS.71).aspx). Вы также можете подключить AppDomain.ResolveEvent, чтобы получить возможность загружать сборку из любой нужды. Лично я бы сделал это в коде C# выше. –

ответ

3

Похоже, проблема в том, что tools.Utilities.dll сам по себе хорошо, но один, если его зависимости недоступны внутри c:\Program Files\subDir. Это предлагается как сообщением об ошибке, так и тем фактом, что перемещение DLL в другую папку устраняет проблему. Вероятно, отсутствующая зависимость доступна в новой папке.

Самый простой способ проверить это - использовать fuslogvw.exe, чтобы точно увидеть, какая ошибка предотвращает загрузку tools.Utilities.dll.

1

Добавить Ассамблею Ваш GAC:

gacutil /i Assembly.dll 
+0

Опция gacutil представляется наиболее прямым решением. Однако, когда я пытаюсь добавить DLL в GAC, я получаю сообщение об ошибке «Ошибка добавления сборки в кэш: Неизвестная ошибка. Я попробовал это с помощью пути к сборке, а затем cd'd в каталог dll и попробовал тот же но я получил ту же ошибку. Не знаю, где искать подробности об ошибке. – user459866

+0

Я нашел, что gacutil, который я использовал, был из версии .NET 1.x. К сожалению, хотя поставляемое программное обеспечение будет находиться под .NET. 3.5 или выше GAC не будет частью установленной системы. Если я вручную скопирую файлы в gac, я могу использовать этот класс и методы без ошибок. Поскольку GAC - это представление, можно написать сценарий powershell, который имитирует действия газификации? – user459866

+0

Извините - понятия не имею.Почему вы не можете использовать GAC в установке? Я не гуру развертывания (и на самом деле не использую его сам), так что извините, я не могу больше помогать. – cristobalito

Смежные вопросы