.Net Framework中的AppDomain.AssemblyResolve事件的常见用法、问题,以及解决办法( 三 )

AssemblyResolveHook
几点解释:        问:例程中的GetFieldValue/SetFieldValue,没有这样的方法?        答:这是扩展方法,能看到这里的你,也不会在乎反射的这几行代码怎么写                问:AssemblyResolveHook.Handsup 调用之后,新添加的 AssemblyResolve 事件响应有问题怎么办?        答:一般AssemblyResolve事件会在第一时间响应,故可延迟调用AssemblyResolveHook.Handsup                 问:怎么知道字段名是 _AssemblyResolve?        答:反正用VS2022社区版,光标放代码的AppDomain上按F12,就能看到答案 。其它版本VS应该也行                问:被关小黑屋了,如果对方要注销 AssemblyResolve 事件的响应咋办?         答:太多问题了…
五、探讨
       本问题提及AssemblyResolve事件的某响应函数一旦返回了非null程序集,就不会再调用后续的响应函数,可以光标放代码的AppDomain上按F12,找到对应的 .NET Framwork 代码证实 。       如下:
 1 [SecurityCritical] 2 private RuntimeAssembly OnAssemblyResolveEvent(RuntimeAssembly assembly, string assemblyFullName) 3 { 4 ResolveEventHandler assemblyResolve = _AssemblyResolve; 5 if (assemblyResolve == null) { 6 return null; 7 } 8 9 Delegate[] invocationList = assemblyResolve.GetInvocationList();10 int num = invocationList.Length;11 for (int i = 0; i < num; i++) {12 Assembly asm = ((ResolveEventHandler)invocationList[i])(this, new ResolveEventArgs(assemblyFullName, assembly));13 RuntimeAssembly runtimeAssembly = GetRuntimeAssembly(asm);14 if (runtimeAssembly != null) {15 return runtimeAssembly;16 }17 }1819 return null;20 }OnAssemblyResolveEvent
如果哪天微软对上述代码稍加修改,本关小黑屋方法就可以退休了 。       (全文完,本文最早由yangzhj发表于博客园,转载需注明出处)
【.Net Framework中的AppDomain.AssemblyResolve事件的常见用法、问题,以及解决办法】

经验总结扩展阅读