我们的应用程序会创建单独的沙盒' AppDomains是为了加载插件代码,这样我们就可以在完成这些插件后卸载这些插件。
我们在沙箱AppDomain中使用AssemblyResolve事件,以动态修复不在沙箱探测路径上的任何程序集。
在单元测试中运行此代码时,它的行为符合预期:
- 已创建新的AppDomain。
- 调用CreateInstanceAndUnwrap以获取AppDomain的代理。
- CLR加载包含代理类型的程序集,并在AppDomain边界上编组实例。
- 在代理上调用我们的init方法来连接AppDomain中的AssemblyResolve事件。
- 开始在应用领域开展工作。
- 当方法是JIT时触发的AssemblyResolve事件,并由我们的自定义程序集解析程序正确处理。
醇>
但是,当我们将其部署到环境时,此行为会发生变化:
- 已创建新的AppDomain。
- 调用CreateInstanceAndUnwrap以获取AppDomain的代理。
- CLR尝试加载由定义代理类型的程序集引用的 ALL 程序集。
- 某些程序集解析无提示失败(因为尚未连接AssemblyResolve)。
- 在代理上调用init方法以挂接AppDomain中的AssemblyResolve事件。
- 开始在应用领域开展工作。
- 抛出FileNotFoundException("无法加载程序集......"),因为缓存了步骤4中失败的程序集解析,并且CLR没有尝试重新加载assm。
醇>
关键区别在于行为是CLR试图预先加载每个引用的程序集。
我不希望发生这种情况,因为代理类型中的代码都不依赖于引用中的任何代码。为什么CLR在没有任何需要它的情况下试图加载引用的程序集?