GetCustomAttribute 在自定义 AssemblyLoadContext 中找不到通过“Assembly.LoadFrom(path)”加载的程序集的属性。
负载流:
- 主应用程序具有自定义 AssemblyLoadContext
- 自定义 AssemblyLoadContext 指向程序集 X 并加载它
- 自定义 AssemblyLoadContext 执行 EnterContextualReflection
- 自定义 AssemblyLoadContext 从程序集 X 创建类型的实例
- 该类型执行 Assembly.LoadFrom(path) 并成功加载程序集 Y
程序集 Y 上有一个程序集级属性。该属性来自静态链接到 X 和 Y 的共享程序集 (TechTalk.SpecFlow)。
当我尝试通过它的类型版本获取属性时,Attribute.GetCustomAttribute
它返回 null。
当我通过属性列出所有属性时,CustomAttributes
该属性就在那里并且它具有完全相同的程序集全名。
如果我尝试将其转换为静态已知类型,则会出现奇怪的异常:
[A]TechTalk.SpecFlow.Plugins.RuntimePluginAttribute 不能转换为 [B]TechTalk.SpecFlow.Plugins.RuntimePluginAttribute。类型 A 源自 'TechTalk.SpecFlow, Version=3.1.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41' 在位置 'c:\Users\yapaxi\source\repos\IntegrationTests\IntegrationTests.ChargingTokens\bin 的上下文'Default'中\Debug\netcoreapp3.1\TechTalk.SpecFlow.dll'。类型 B 源自 'TechTalk.SpecFlow, Version=3.1.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41' 在位置'c:\Users\yapaxi\source\repos\IntegrationTests\IntegrationTests.ChargingTokens\bin 的上下文'Default'中\Debug\netcoreapp3.1\TechTalk.SpecFlow.dll'。
出于某种原因,它认为两个程序集都加载到了Default
上下文中,这很奇怪,因为所有加载都发生在自定义程序集加载上下文中。
如果我在它显示自定义加载上下文的名称AssemblyLoadContext.CurrentContextualReflectionContext.Name
之前尝试- 正如预期的那样。Assembly.LoadFrom
为什么它仍然认为程序集已加载到默认上下文?主应用程序甚至没有对这些程序集的静态引用——它根本没有任何自定义引用。
如果我直接运行程序集 X(没有 AssemblyLoadContext)它一切正常。
环境:
- 网核3.1
- SDK 3.1.201
- VS 16.4.3