Assembly.LoadFrom завершается ошибкой при обращении к Microsoft.EntityFrameworkCore.dll - PullRequest
2 голосов
/ 14 мая 2019

При попытке динамически загрузить библиотеки в мое приложение .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. Я подтвердил, что этот файл существует в целевом местоположении.

Любые рекомендации о том, что происходит?

...