【问题标题】:AssemblyLoadContext and Assembly.LoadFrom(path)AssemblyLoadContext 和 Assembly.LoadFrom(path)
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多