【发布时间】:2020-05-03 20:58:42
【问题描述】:
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 \Debug\netcoreapp3.1\TechTalk.SpecFlow.dll'。
由于某种原因,它认为两个程序集都加载到了 Default 上下文中,这很奇怪,因为所有加载都发生在自定义程序集加载上下文中。
如果我在Assembly.LoadFrom 之前尝试AssemblyLoadContext.CurrentContextualReflectionContext.Name,它会显示自定义加载上下文的名称 - 正如预期的那样。
为什么它仍然认为程序集已加载到默认上下文?主应用程序甚至没有对这些程序集的静态引用——它根本没有任何自定义引用。
如果我直接运行程序集 X(没有 AssemblyLoadContext),它一切正常。
环境:
- 网核3.1
- SDK 3.1.201
- VS 16.4.3
【问题讨论】:
标签: .net .net-core .net-core-3.1 assembly-loading