gpt4 book ai didi

c# - "Method not found"异常。为什么 AppDomain.CurrentDomain.AssemblyResolve 不起作用?

转载 作者:太空狗 更新时间:2023-10-29 22:25:24 28 4
gpt4 key购买 nike

  1. 有一个应用程序 (executor.exe) 使用反射从类库 (lib.dll) 调用方法。
  2. executor.exe 具有程序集 Newtonsoft.Json 版本 8.0 作为嵌入式资源。
  3. lib.dll 引用了 Newtonsoft.Json 版本 9.0。
  4. lib.dll 引用了 system.net.http.formatting 版本 4.0.0.21112,后者又引用了 Newtonsoft.Json 4.5。
  5. 我没有机会修改 executor.exe.config(测试除外)。

我想得到什么:

new JsonMediaTypeFormatter().SerializerSettings;

从 lib.dll 调用。但它失败了:

Method not found: 'Newtonsoft.Json.JsonSerializerSettings System.Net.Http.Formatting.JsonMediaTypeFormatter.get_SerializerSettings()'

我想做的是:

  1. 处理 AppDomain.CurrentDomain.AssemblyResolve(正确订阅,使用 ModuleInitializer)。但它不上升。崩溃后将 2 个 Newtonsoft.Json(具有不同版本)加载到 AppDomain。
  2. 在应用配置中绑定(bind):

     <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"
    culture="neutral" />
    <bindingRedirect oldVersion="4.0.0.0-5.0.0.0" newVersion="9.0.0.0" />

是的,它有效。但我不能使用这个解决方案。通过后将 2 个 Newtonsoft.Json(不同版本)加载到 AppDomain。

  1. 我不明白为什么会这样 (oldVersion="8.0.0.0-9.0.0.0") 但是:

    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="8.0.0.0-9.0.0.0" newVersion="9.0.0.0" />

不会抛出“找不到方法”异常。通过后将 1 个 Newtonsoft.Json (9.0) 加载到 AppDomain。但不适合我。

为什么 AppDomain.CurrentDomain.AssemblyResolve 不起作用?我猜问题出在 2 个加载的程序集中,但我无法更改此行为。

最佳答案

Why AppDomain.CurrentDomain.AssemblyResolve doesn't work?

如果程序集解析失败,将触发事件 AppDomain.CurrentDomain.AssemblyResolve。这不是你的情况,因为你看到 Newtonsoft.Json 程序集已经加载到应用程序域中。

您捕获 MissingMethodException 因为 System.Net.Http.Formatting.JsonMediaTypeFormatter.get_SerializerSettings() 返回 JsonSerializerSettings 在 Newtonsoft.Json 版本 4.5 中声明.不幸的是,对于没有灵魂的 CLR,来自 Newtonsoft.Json 4.5 的 JsonSerializerSettings 与来自 Newtonsoft.Json 9.0 的 JsonSerializerSettings 完全不同。

为了解决这个问题,引入了程序集版本重定向机制(bindingRedirect,您指的是)。

exception "Method not found" doesn't throw. After passing have 1 Newtonsoft.Json (9.0) loaded to AppDomain. But not suitable for me.

实际上,这是您应该坚持的解决方案。最好的选择是只将一个 Newtonsoft.Json 程序集加载到应用程序域并配置版本重定向。

您为什么要重新发明轮子并尝试寻找平台提供以外的解决方案?如果出于某种奇怪的原因你被禁止修改应用程序配置,你可以在机器级别添加程序集重定向看这个article了解详情。但是汇编版本重定向是多么永恒的方式DLL hell problem固定在 .Net 中。使用任何其他解决方法(即使您设法找到了它们)也不会对您不利。

关于c# - "Method not found"异常。为什么 AppDomain.CurrentDomain.AssemblyResolve 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47320175/

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