【问题标题】:How can I load a .net native image (NGEN) into multiple appdomains without specifying domain neutrality?如何在不指定域中立性的情况下将 .net 本机映像 (NGEN) 加载到多个 appdomains 中?
【发布时间】:2010-12-21 21:05:07
【问题描述】:

这里是 NGEN + AppDomain 问题。

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

我对域中性加载了如指掌,并且已经在一些有意义的程序集中使用了它,但是进行域中性加载抵消了首先使用 appdomains 的主要原因之一我们——因为永远无法卸载域中性图像。

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

This MSDN article 包含以下引用:

另一种跌倒的方法 回到JIT编译就是加载 本机图像的不同副本 到加载的每个 AppDomain 对应的组件为 特定领域。然而,这 方法将需要每个副本 NGen 图像,除了第一个, 加载到不同的地址 从它的首选基地址。因此 NGen 映像的所有这些副本 需要修复他们的地址。

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

提前感谢您提供任何见解,并感谢您的关注。

【问题讨论】:

  • would require 的时态很麻烦。它读起来像“如果我们允许这样做,那么我们必须修复所有地址。这是非常低效的,所以我们不支持”。就此致电 MSFT。

标签: .net performance appdomain ngen


【解决方案1】:

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

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

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

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

谢谢 拉克山费尔南多 CLR 团队

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 2019-11-30
    相关资源
    最近更新 更多