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