В одном из наших приложений у нас было пользовательское событие 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 потом, но не смог - я не мог понять, как объявить сборку (или зависимость), чтобы я попал в ту же ситуацию. Я использовал строгое именование, несоответствие версий, зависимости ... но не повезло.
Не могли бы вы помочь со следующими двумя вопросами:
- Была ли сборка загружена / Сборка загружена Изменение обработки событий с 4.8 ИЛИ это могло быть проблемой с по-разному восстановленными пакетами nuget?
- Как я могу собрать сборки, чтобы заставить такое поведение и иметь тестовый сценарий для него?