gpt4 book ai didi

.net - AssemblyLoadContext 和 Assembly.LoadFrom(路径)

转载 作者:行者123 更新时间:2023-12-05 07:09:24 25 4
gpt4 key购买 nike

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 cannot be cast to [B]TechTalk.SpecFlow.Plugins.RuntimePluginAttribute. Type A originates from 'TechTalk.SpecFlow, Version=3.1.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41' in the context 'Default' at location 'c:\Users\yapaxi\source\repos\IntegrationTests\IntegrationTests.ChargingTokens\bin\Debug\netcoreapp3.1\TechTalk.SpecFlow.dll'. Type B originates from 'TechTalk.SpecFlow, Version=3.1.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41' in the context 'Default' at location '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
  • 对比 16.4.3

最佳答案

也许这个article可以帮助您找出问题所在。特别是解释如何调试共享依赖项的类型转换问题的部分。问题是默认的调试器输出没有给你足够的信息来解决这种错误。

关于.net - AssemblyLoadContext 和 Assembly.LoadFrom(路径),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61581530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com