|
|
1
16
程序集未以任何特定方式标记为域无关。你不必给他们一些特定的属性,使他们领域中立。CLR可以将任何程序集加载到共享域或触发程序集加载的域中,具体取决于程序集的配置 CLR实例 CLR实例决定如何加载程序集是由策略决定的。有几种方法可以显式设置此策略:
作为域中立加载的程序集将加载到共享域中。应用程序域名在CLRv4中为“EE共享程序集存储库”。这不是一个真正的应用程序域,因为它没有数据,也不能运行任何代码。加载到其中的程序集将在所有其他正在运行的应用程序域中共享其代码。程序集中的字节码将只进行一次JIT编译。但是,程序集中的所有可变数据将在正在运行的域中复制。 应用程序域之间不共享静态字段。 每个应用程序域静态字段将被复制,不同的应用程序域在引用同一静态字段时将在内存中的不同位置进行读写。 旁白:还有另一种静态字段-RVA statics,它在当前进程中的所有应用程序域之间共享。C++中没有这样的字段,但是它可以用C++或CLI来完成。 在使用与域无关的程序集时有一个权衡。 访问静态字段的速度较慢。 由于它们只被JIT-ted一次,但可能会访问每个应用程序域静态字段的多个实例,因此对静态字段的任何访问都会经过一个额外的间接过程。当程序集直接加载到运行域中时,静态字段的地址可以直接嵌入到JIT-ted代码中。但是,当编译到共享程序集中的代码尝试访问静态字段时,它必须首先加载当前域的上下文,然后在其中找到此域的静态字段地址。
注意:mscorlib总是加载到共享域中。 资料来源和进一步阅读: |
|
|
2
3
与域无关的程序集仅跨appdomains共享代码。但是,数据仍然是每个appdomain的。因此,将有一个静态
|
|
|
3
0
实际上,有一种棘手的、没有文档记录的方法可以跨域共享数据,但它会导致运行时错误和整个应用程序崩溃。作者不建议在实际项目中使用它,所以您可以改用MarshalByRef对象来共享日志使用者。 http://geekswithblogs.net/akraus1/archive/2012/07/25/150301.aspx |