调试设置了 CorFlags ILLibrary 标志的程序集

Debugging of assemblies with CorFlags ILLibrary flag set

我试过调试一些 ASP.NET 核心应用程序。虽然我已经将 COMPLUS_ZapDisable 环境变量设置为 1 并在 Visual Studio 中检查了 'Suppress JIT optimization on module load',但几个框架程序集中的代码很难调试,因为它被优化了。

进一步调查后,我发现这些程序集设置了 CorFlags.ILLibrary 标志。这些程序集似乎嵌入了预编译代码。查看反汇编视图我可以看到这段预编译代码确实正在执行

我没有找到关于此功能的任何文档。它的行为类似于 NGen-ed 程序集,其中本机代码不在单独的 .ni.dll 文件中,而是嵌入在原始程序集中。

有人知道如何创建这样的程序集以及如何在调试时禁用预编译代码吗?

谢谢!

我终于找到了答案:

.NET Core 使用了一种名为Ready2Run. Assemblies are precompiled using CrossGen 的新预编译方法。生成的程序集设置了 CorFlags.ILLibrary 标志。

可以通过将 COMPlus_ReadyToRun 环境变量设置为 0 来防止在运行时使用预编译代码。

可能最好也将 COMPlus_TieredCompilation 环境变量设置为 0(参见 here and here)。