При попытке динамически загрузить библиотеки в мое приложение .NET Core я, похоже, запускаю следующее исключение:
FileLoadException: Could not load file or assembly 'Microsoft.EntityFrameworkCore, Version=2.2.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. Could not find or load a specific file.
Stacktrace указывает обратно на Assembly.LoadFrom
, который вызывается следующим пользовательским обработчиком событий для AppDomain.CurrentDomain.AssemblyResolve
private Assembly LoadAssembly(string directory, string assemblyName)
{
Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.FullName == assemblyName);
if (assembly != null)
return assembly;
Assembly result = null;
var targetFile = System.IO.Path.Combine(directory, assemblyName.Split(',')[0] + ".dll");
if (File.Exists(targetFile))
{
result = Assembly.LoadFrom(targetFile);
}
return result;
}
(Обратите внимание, что технически обработчик событий - это лямбда, которая перенаправляет на этот метод, отсюда и необычная подпись)
Цель этого обратного вызова - разрешить ссылки на сборки из загруженного плагина - к тому времени, когда мы здесь окажемся, мы уже однажды успешно вызвали Assembly.LoadFrom.
Исполнение явно проходит проверку того, существует файл или нет; однако я не могу определить причину сбоя загрузки.
Единственная возможная причина, которую я могу определить, это то, что она выполняет проверку, аналогичную следующей:
Начиная с .NET Framework 4, возможность выполнения кода в сборках, загруженных из удаленных расположений, по умолчанию отключена, а вызов метода LoadFrom вызывает исключение FileLoadException.
Из Документы Microsoft - сборка .NET Framework. Загрузка из
Однако программа не дает сбоя при всех загрузках, только первая загрузка в эту сборку. В частности, две другие сборки преуспевают заранее - одна вне обратного вызова, а другая внутри обратного вызова перед попыткой разрешить Microsoft.EntityFrameworkCore.dll
. Я подтвердил, что этот файл существует в целевом местоположении.
Любые рекомендации о том, что происходит?