AssemblyLoadContext и Assembly.LoadFrom (путь) - PullRequest
0 голосов
/ 03 мая 2020

GetCustomAttribute не может найти атрибут в сборке, загруженной через "Assembly.LoadFrom (path)" в пользовательском AssemblyLoadContext.

Поток загрузки:

  • Основное приложение имеет пользовательский AssemblyLoadContext
  • Пользовательский AssemblyLoadContext указывает на сборку X и загружает ее
  • Пользовательский AssemblyLoadContext выполняет EnterContextualReflection
  • Пользовательский AssemblyLoadContext создает экземпляр типа из сборки X
  • Тип выполняет сборку .LoadFrom (путь) и успешно загружает сборку Y

Сборка Y имеет атрибут уровня сборки. Атрибут происходит из общей сборки (TechTalk.SpecFlow), которая статически связана как с X, так и с Y.

Когда я пытаюсь получить атрибут через тип-версию Attribute.GetCustomAttribute, он возвращает ноль.

Когда я перечисляю все атрибуты через свойство CustomAttributes, тогда атрибут присутствует и у него точно такое же полное имя сборки.

Если я пытаюсь привести его к статически известному типу, появляется странное исключение:

[A] TechTalk.SpecFlow.Plugins.RuntimePluginAttribute не может быть приведен к [B] TechTalk.SpecFlow.Plugins.RuntimePluginAttribute. Тип A происходит от 'TechTalk.SpecFlow, Version = 3.1.0.0, Culture = нейтральный, PublicKeyToken = 0778194805d6db41' в контексте 'Default' в расположении 'c: \ Users \ yapaxi \ source \ repos \ IntegrationTests \ IntegrationTests.ChargingTokens \ Bin \ Debug \ netcoreapp3.1 \ TechTalk.SpecFlow.dll. Тип B происходит из «TechTalk.SpecFlow, Version = 3.1.0.0, Culture = нейтральный, PublicKeyToken = 0778194805d6db41» в контексте «По умолчанию» в расположении «c: \ Users \ yapaxi \ source \ repos \ IntegrationTests \ IntegrationTests.ChargingTokens \ bin \ Debug \ netcoreapp3.1 \ TechTalk.SpecFlow.dll '.

По какой-то причине он считает, что обе сборки загружены в контекст Default, что странно, потому что происходит вся загрузка в пользовательском контексте загрузки сборок.

Если я попытаюсь AssemblyLoadContext.CurrentContextualReflectionContext.Name до Assembly.LoadFrom, то он отображает имя пользовательского контекста загрузки - как и ожидалось.

Почему он все еще думает, что сборки загружен в контекст по умолчанию? Основное приложение даже не имеет stati c ссылок на эти сборки - оно вообще не имеет никаких пользовательских ссылок.

Если я запускаю сборку X напрямую (без AssemblyLoadContext), все это работает хорошо.

Конверт:

  • net core 3.1
  • SDK 3.1.201
  • VS 16.4.3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...