我们正在开发一个应用程序,它极大地受益于 .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。
以下是该问题的简单再现:
创建一个新的控制台应用程序,将其目标框架设置为 .NET 2。添加图像中显示的代码并在 SomeFunction 之后设置断点。
将 IntelliTrace 设置为“IntelliTrace 事件和呼叫信息”
开始调试。一旦断点被击中,您应该得到以下正确的 IntelliTrace:
停止调试并退出 Visual Studio。
- 以提升模式打开新的 cmd.exe
- 执行:
%windir%\Microsoft.NET\Framework\v2.0.50727\ngen install "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /Profile
- 再次启动 Visual Studio 并开始调试。将命中相同的断点。但是,这一次 IntelliTrace 将如下所示:
- 要使 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 标志,仍然安装。
问题
- 有没有办法 NGEN 卸载 mscorlib /profile,即使安装了其他 ngen /profile 程序集?
- 执行 NGen /Profile 后,是否有使 IntelliTrace 正常工作的解决方法?
- 为什么 /NoDependencies 标志没有按预期工作?
谢谢你,维塔利贝尔曼