......并且这些步骤是否也可以应用于第三方程序集(可能已经强名称)?
我的问题的上下文不应该是重要的,但无论如何我都会分享:我正在考虑制作一个记录器(或日志包装器),它始终知道要定位的"日志源",无论使用它的程序集是在一个应用程序域中,或分布在多个应用程序域中.我认为实现这一目标的一种方法是使用具有静态"LogSource"属性的域中性程序集.如果在域中性程序集中设置了静态属性,我认为所有appdomains都会看到它.
Ste*_*nev 14
程序集未以任何特定方式标记为域中立.您不必为它们提供某些特定属性,以使它们与域无关.CLR可以将任何程序集加载到共享域或触发程序集加载的域中,具体取决于加载程序集的CLR实例的配置.
CLR实例如何决定加载程序集由策略决定.有几种方法可以明确设置此策略:
作为域中立加载的程序集将加载到共享域中.应用程序域名是CLRv4中的"EE Shared Assembly Repository".这不是一个真正的应用程序域,因为它没有数据,也无法运行任何代码.加载到其中的程序集将在所有其他正在运行的应用程序域中共享其代码.程序集中的字节代码只能进行JIT编译一次.但是,程序集中的所有可变数据都将在运行域之间重复.应用程序域之间不共享静态字段.每个应用程序域静态字段将被复制,并且当引用相同的静态字段时,不同的应用程序域将在内存中的不同位置读取和写入.
除此之外:还有另一种静态字段--RVA静态字段,在当前进程中的所有应用程序域之间共享.无法在C#中声明这样的字段,但可以在C++/CLI中完成.
在使用域中立程序集时需要权衡利弊.访问静态字段的速度较慢.由于它们仅被JIT-ted一次,但可以访问每个app域静态字段的多个实例,因此对静态字段的任何访问都会通过额外的间接访问.当程序集直接加载到运行域时,静态字段的地址可以直接嵌入到JIT-ted代码中.但是,当编译到共享程序集中的代码尝试访问静态字段时,它必须首先加载当前域的上下文,然后在其中查找此域的静态字段地址.
是否将程序集加载到共享域或运行域中的决定取决于您的用例,更具体地说,您要创建的应用程序域数以及要加载到哪种核心.
注意:mscorlib始终加载到共享域中.
来源和进一步阅读: