【发布时间】: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这样的标志。