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