如何在不指定域中立的情况下将.NET本机图像(NGEN)加载到多个应用程序中?
-
12-10-2019 - |
题
NGEN + AppDomain问题在这里。
我正在研究一些应用程序更改,这些更改围绕着正确加载本机图像,以防止我们的.NET应用程序中的糟糕JIT时间。有些部分很容易,但是任何必须加载AppDomains的组件(由于各种原因,我们的应用都必须使用该程序),只会在第一次和后续负载(现在是一个新的AppDomain)上加载其本机映像。图像被拒绝并发生JIT。
我对域中性负载了解全部,并且已经在我们的某些组件中使用它是有道理的,但是进行域中的负载可以消除首先使用AppDomains的主要原因之一 - 由于域中性图像永远无法卸载。
简洁地说,我需要一种方法来使本机图像加载和装配卸载。我曾希望,只要我在尝试再次加载本机之前的第一个使用本机图像的第一个用法,正常限制就不会适用,但是这会导致拒绝,就像试图同时加载本机图像一样。
这篇MSDN文章 包含以下报价:
回到JIT汇编的另一种方法是将本机图像的不同副本加载到每个AppDomain中,将相应的组件加载为特定于域的域。但是,此方法将需要NGEN映像的每个副本,除了第一个图像外,要与其首选的基础地址不同地址加载。因此,NGEN图像的所有这些副本都需要修复其地址。
这将是我需求的完美选择,但是这篇文章是我见过的唯一提到的地方,我不确定如何实施它。
在此先感谢您的任何见解,并感谢您的查看。
解决方案
我曾希望,只要我在尝试再次加载本机之前的第一个使用本机图像的第一个用法,正常限制就不会适用,但是这会导致拒绝,就像试图同时加载本机图像一样。
这有效,但是您必须等待本机映像实际卸载。当AppDomain.unload返回时,AppDomain并未完全卸载。仅在下一次完整的GC之后,AppDomain才能完全卸载(以及本机图像)。
此MSDN文章包含以下报价:
Surupa猜测CLR中可能的替代实现,但目前尚未实施。
感谢Lakshan Fernando CLR团队