2

NGEN + AppDomain 问题在这里。

我正在进行一些应用程序更改,这些更改围绕使本机图像正确加载以防止在我们的 .net 应用程序中出现糟糕的 JIT 时间。有些部分很简单,但是任何必须在 appdomains 中加载的程序集(我们的应用程序由于各种原因必须使用它)只会在第一次加载它们的本机图像,并且在后续加载时(现在是新的 appdomain)图像被拒绝并发生 JIT。

我知道所有关于域中性加载的知识,并且已经在我们的一些程序集中使用了它,但这样做是为了消除域中性加载首先对我们来说使用 appdomains 的主要原因之一——因为永远无法卸载域中性图像。

简而言之,我需要一种方法来加载本机图像和卸载程序集。我曾希望,只要我在尝试再次加载本机映像之前卸载第一次使用的本机映像,就不会适用正常限制,但这会导致拒绝,就像尝试同时加载本机映像一样。

这篇 MSDN 文章包含以下引用:

回退到 JIT 编译的另一种方法是将本机映像的不同副本加载到每个 AppDomain 中,该 AppDomain 将相应的程序集加载为特定于域的程序集。但是,这种方法需要 NGen 映像的每个副本(第一个除外)都加载到与其首选基地址不同的地址。因此,NGen 映像的所有这些副本都需要修复它们的地址。

这对我的需求来说是完美的,但那篇文章是我见过的唯一提到它的地方,我不确定它会如何实现。

在此先感谢您的任何见解,并感谢您的关注。

4

1 回答 1

3

我曾希望,只要我在尝试再次加载本机映像之前卸载第一次使用的本机映像,就不会适用正常限制,但这会导致拒绝,就像尝试同时加载本机映像一样。

这可行,但您必须等待本机图像实际卸载。当 AppDomain.Unload 返回时,appdomain 并未完全卸载。只有在下一次完全 GC 之后,appdomain 才会被完全卸载(连同本机图像)。

这篇 MSDN 文章包含以下引用:

Surupa 正在推测 CLR 中可能的替代实现,但目前尚未实现。

感谢 Lakshan Fernando CLR 团队

于 2011-01-31T21:59:46.697 回答