1

我们正在开发一个应用程序,它极大地受益于 .NET 框架的 Profiled Native Images。因此,在我们的安装过程中,我们在几个 .NET 程序集上运行以下命令:

ngen install "ASSEMBLY NAME" /Profile

在部署我们的应用程序后不久,我们就收到了用户在 Visual Studio 2010 中的 IntelliTrace 功能停止工作的投诉。经过短暂调查后,我们发现一旦有 mscorlib.dll 的Profiling Native Image,IntelliTrace 就会停止工作。此外,当它发生时,我们会在事件查看器中收到以下消息:

TraceLog Profiler 检测到加载到进程中的 NGEN /profile 程序集。不支持此类程序集。收集将被禁用。

这尤其令人不安,因为 mscorlib.dll 是任何其他 .NET 程序集的依赖项,这意味着ngen install ... /profile在任何程序集上使用也会导致生成 mscorlib.dll。

以下是该问题的简单再现:

  1. 创建一个新的控制台应用程序,将其目标框架设置为 .NET 2。添加图像中显示的代码并在 SomeFunction 之后设置断点。 示例代码

  2. 将 IntelliTrace 设置为“IntelliTrace 事件和呼叫信息”

  3. 开始调试。一旦断点被​​击中,您应该得到以下正确的 IntelliTrace: 正确的 IntelliTrace

  4. 停止调试并退出 Visual Studio。

  5. 以提升模式打开新的 cmd.exe
  6. 执行: %windir%\Microsoft.NET\Framework\v2.0.50727\ngen install "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /Profile
  7. 再次启动 Visual Studio 并开始调试。将命中相同的断点。但是,这一次 IntelliTrace 将如下所示: 损坏的 IntelliTrace
  8. 要使 IntelliTrace 在同一 cmd 窗口中再次运行:

%windir%\Microsoft.NET\Framework\v2.0.50727\ngen uninstall "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /Profile

我们还尝试使用ngen.exe 的/NoDependencies标志来仅添加特定程序集,而不添加 mscorlib,但是,似乎该标志被忽略 - 即使我们已经执行ngen install ... /Profile /NoDependencies,依赖项已安装:运行ngen display | find "<profiling>"显示 mscorlib即使使用了 /NoDependencies 标志,仍然安装。

问题

  1. 有没有办法 NGEN 卸载 mscorlib /profile,即使安装了其他 ngen /profile 程序集?
  2. 执行 NGen /Profile 后,是否有使 IntelliTrace 正常工作的解决方法?
  3. 为什么 /NoDependencies 标志没有按预期工作?

谢谢你,维塔利贝尔曼

4

2 回答 2

2

好的,我对OpenCover也有类似的问题,我被告知解决这个问题的方法是

ngen uninstall "assembly details" /Profile 

IntelliTrace 可能正在尝试检测库以执行跟踪,但它不能这样做,因为它不会获取JITCompilationStarted事件,除非它们覆盖JITCachedFunctionSearchStarted事件。

最好的办法是在开发机器上卸载 /Profile 场景程序集。

我知道我已经重申了你所知道的,但我希望能提供一个关于为什么会发生的答案,但这可能不是你自己可以解决的问题。

于 2012-05-01T22:09:33.703 回答
0
  1. 有没有办法 NGEN 卸载 mscorlib /profile,即使安装了其他 ngen /profile 程序集?

您可以通过删除/重命名 mscorlib 的 NIC 文件夹直接删除 mscorlib 的本机映像。例如,对于 .NET 4.0 64 位,文件夹位置为:

c:\Windows\assembly\NativeImages_v4.0.30319_64\mscorlib

于 2017-07-24T07:30:28.643 回答