【问题标题】:How to check the code is running in AOT in C#?如何在 C# 中检查代码是否在 AOT 中运行?
【发布时间】:2021-03-15 09:52:07
【问题描述】:

我正在使用编译表达式来创建实例。由于回退过程,它在 JIT 中非常快,但在 AOT 中却不是(甚至更慢)。所以我想检查代码是否在AOT中运行。如果是,我会改用ConstructorInfo.Invoke

ATM,我只想通过调用 AOT 中不允许的方法之一来检查这一点,然后捕获错误。还有其他更好的检查方法吗?

【问题讨论】:

  • 您的问题是否涉及 ReadyToRun 编译 (docs.microsoft.com/en-us/dotnet/core/deploying/ready-to-run)。所以你想检查当前帧是native还是il代码来判断你编译的表达式或者constructorinfo.invoke是否被使用了?
  • @Jehof 我不确定是否相同。根据描述,R2R是AOT的一种形式。但这是否意味着所有 AOT 都是 R2R?例如 il2cpp、Mono-aot。
  • 不,不是所有的 AOT 都是 R2R。
  • 我正在为其他人制作图书馆。所以我认为检查 R2R 无济于事,因为有不同类型的 AOT。目前我正在通过Reflection.Emit 检查是否有任何异常抛出,因为AOT 不允许在运行时编译代码。但这只是一个试验和错误检查。我想有一种正确的方法来检查我的代码是否在 AOT 下运行。
  • 考虑到 .NET AOT 的混乱,例如 prajaybasu 提到的link,我认为检查 Reflection.Emit 应该是最好的方法,然后才能检查像 Assembly.CompilationMode == CompilationMode.AOT 这样的标志。

标签: c# ahead-of-time-compile


【解决方案1】:

据我所知,并没有真正的本地方法来检查您是否在 AOT 中运行。您描述的运行仅 JIT 方法并捕获错误的方法可能是最好的方法。如果存在的话,这可能就是本机方法无论如何都会这样做的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多