3

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
4

1 回答 1

0

也许这篇文章可以帮助您找出问题所在。尤其是它解释如何调试具有共享依赖项的类型转换问题的部分。问题是默认调试器输出没有为您提供足够的信息来解决此类错误。

于 2020-10-26T21:15:07.247 回答