为什么CLR在调用CreateInstanceAndUnwrap时尝试将所有引用的程序集加载到我的新AppDomain中?

时间:2015-08-24 19:04:15

标签: c# .net appdomain assembly-resolution

我们的应用程序会创建单独的沙盒' AppDomains是为了加载插件代码,这样我们就可以在完成这些插件后卸载这些插件。

我们在沙箱AppDomain中使用AssemblyResolve事件,以动态修复不在沙箱探测路径上的任何程序集。

在单元测试中运行此代码时,它的行为符合预期:

  1. 已创建新的AppDomain。
  2. 调用CreateInstanceAndUnwrap以获取AppDomain的代理。
  3. CLR加载包含代理类型的程序集,并在AppDomain边界上编组实例。
  4. 在代理上调用我们的init方法来连接AppDomain中的AssemblyResolve事件。
  5. 开始在应用领域开展工作。
  6. 当方法是JIT时触发的AssemblyResolve事件,并由我们的自定义程序集解析程序正确处理。
  7. 但是,当我们将其部署到环境时,此行为会发生变化:

    1. 已创建新的AppDomain。
    2. 调用CreateInstanceAndUnwrap以获取AppDomain的代理。
    3. CLR尝试加载由定义代理类型的程序集引用的 ALL 程序集。
    4. 某些程序集解析无提示失败(因为尚未连接AssemblyResolve)。
    5. 在代理上调用init方法以挂接AppDomain中的AssemblyResolve事件。
    6. 开始在应用领域开展工作。
    7. 抛出FileNotFoundException("无法加载程序集......"),因为缓存了步骤4中失败的程序集解析,并且CLR没有尝试重新加载assm。
    8. 关键区别在于行为是CLR试图预先加载每个引用的程序集。

      我不希望发生这种情况,因为代理类型中的代码都不依赖于引用中的任何代码。为什么CLR在没有任何需要它的情况下试图加载引用的程序集?

0 个答案:

没有答案