我的程序集被加载到多个应用程序域中。我的装配的 Ji-ting 是否每个流程执行一次?还是每个应用程序域一次?
或者它是更复杂的东西?
它很复杂。这篇 msdn文章说
如果程序集作为域中性加载,则意味着它的代码可以在另一个 AppDomain 中重用。如果程序集作为域绑定加载到多个 AppDomain 中(这是默认设置),则每个 AppDomain 都会获得自己的代码副本。这有几个不好的性能特征。首先是CPU成本。如果程序集有原生镜像,则只有第一个 AppDomain 可以使用原生镜像。所有其他 AppDomain 都必须对代码进行 JIT 编译,这可能会导致大量 CPU 成本。
接下来,JIT 编译的代码驻留在私有内存中,因此不能与其他进程或 AppDomain 共享。如果程序集确实有 NGEN 映像,则第一个 AppDomain 使用该映像。所有其他 AppDomain 都必须对代码进行 JIT 编译,这意味着该程序集的 MSIL DLL 也会被加载。从冷启动的角度来看,这是最糟糕的情况,因为该程序集的磁盘访问会加倍。
将程序集作为域中性加载可确保本机映像(如果存在)在应用程序中创建的所有 AppDomain 中使用。如果本机映像不存在,则将程序集加载为域中立仍然有好处,因为代码只编译一次,然后由应用程序中的所有 AppDomain 共享。