"未找到方法"例外.为什么AppDomain.CurrentDomain.AssemblyResolve不起作用?

Hop*_*ess 5 .net c#

  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;
Run Code Online (Sandbox Code Playgroud)

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

找不到方法:'Newtonsoft.Json.JsonSerializerSettings System.Net.Http.Formatting.JsonMediaTypeFormatter.get_SerializerSettings()'

我想做什么:

  1. 处理AppDomain.CurrentDomain.AssemblyResolve(使用ModuleInitializer正确订阅).但它并没有上升.崩溃后有2个Newtonsoft.Json(带有不同的版本)加载到AppDomain.
  2. 在app config中绑定:

     <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"
     culture="neutral" />
     <bindingRedirect oldVersion="4.0.0.0-5.0.0.0" newVersion="9.0.0.0" />
    
    Run Code Online (Sandbox Code Playgroud)

是的,它有效.但我不能使用这个解决方案.传递后将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" />
    
    Run Code Online (Sandbox Code Playgroud)

异常"未找到方法"不抛出.传递后将1个Newtonsoft.Json(9.0)加载到AppDomain.但不适合我.

为什么AppDomain.CurrentDomain.AssemblyResolve不起作用?我想问题是在2个加载的程序集中,但我不能改变这种行为.

Cod*_*ler 7

为什么AppDomain.CurrentDomain.AssemblyResolve不起作用?

AppDomain.CurrentDomain.AssemblyResolve如果程序集解析失败,则触发事件.由于您看到Newtonsoft.Json已在应用程序域中加载了程序集,因此不是您的情况.

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

为了解决这个问题,引入了用于重定向程序集版本的机制(bindingRedirect您参考).

异常"未找到方法"不抛出.传递后将1个Newtonsoft.Json(9.0)加载到AppDomain.但不适合我.

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

为什么要重新发明轮子并尝试找到除平台优惠之外的解决方案?如果由于某些奇怪的原因您被禁止修改应用程序配置,您可以在机器级别添加程序集重定向有关详细信息,请参阅此文章.但是汇编版本重定向是如何在.Net中修复永恒的DLL地狱问题的方式.使用任何其他解决方法(即使您设法找到它们)将使您无益.