Assembly.LoadFile поднимает событие разрешения сборки на ту же сборку - PullRequest
0 голосов
/ 06 апреля 2020

В одном из наших приложений у нас было пользовательское событие Assembly Resolve, которое выглядит ниже. Хотя это было далеко от совершенства, в нашем приложении это работало нормально (то есть: достаточно хорошо), когда мы нацеливались на NET FX 4.6.2

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
    string fileName = args.Name.Split(',').FirstOrDefault();

    if (!string.IsNullOrEmpty(fileName))
    {
        fileName += ".dll";

        FileInfo fileInfo = new FileInfo(Assembly.GetEntryAssembly().Location);

        string filePath = null;

        //If block should just make sure that filePath is set to an existing file...
        //left it in in case I misread something in there...
        if (fileInfo.Directory != null)
        {
            filePath = Path.Combine(fileInfo.Directory.FullName, fileName);
            if (!File.Exists(filePath))
            {
                filePath = Path.Combine(standardAddInsDirectory, fileName);
                if (!File.Exists(filePath))
                {
                    filePath = Path.Combine(customerAddInsDirectory, fileName);
                    if (!File.Exists(filePath))
                    {
                        filePath = null;
                    }
                }
            }
        }
        //at this point filePath should be either null OR the full path to the dll

        Assembly assembly = null;
        if (!string.IsNullOrEmpty(filePath))
        {
            assembly = Assembly.LoadFile(filePath); //this line raised AssemblyResolve again
        }
        return assembly;
    }
    return null;
};

Однако нам пришлось обновить до 4.8, и когда-то там, мы получили исключение stackoverflow, потому что Assembly.Load (путь) действительно вызвал событие разрешения сборки для той же самой сборки, которую мы пытались загрузить. Точный случай, из-за которого наш код был нарушен, был «Microsoft.Extensions.Primitives 3.0.0.0», но мы поставили только версию 2.2. Мы действительно вызвали Assembly.Load для версии 2.2, и событие снова было вызвано для той же сборки / версии («Microsoft.Extensions.Primitives 3.0.0.0»).

Я хотел написать небольшой MVS / Testcase потом, но не смог - я не мог понять, как объявить сборку (или зависимость), чтобы я попал в ту же ситуацию. Я использовал строгое именование, несоответствие версий, зависимости ... но не повезло.

Не могли бы вы помочь со следующими двумя вопросами:

  1. Была ли сборка загружена / Сборка загружена Изменение обработки событий с 4.8 ИЛИ это могло быть проблемой с по-разному восстановленными пакетами nuget?
  2. Как я могу собрать сборки, чтобы заставить такое поведение и иметь тестовый сценарий для него?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...