如何在 C# 中检查代码是不是在 AOT 中运行?

Posted

技术标签:

【中文标题】如何在 C# 中检查代码是不是在 AOT 中运行?【英文标题】: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 这样的标志。 【参考方案1】:

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

【讨论】:

以上是关于如何在 C# 中检查代码是不是在 AOT 中运行?的主要内容,如果未能解决你的问题,请参考以下文章

C#:如何以编程方式检查 Web 服务是不是已启动并正在运行?

如何 AOT(提前)编译 C++ 程序

在 C# 中以编程方式检查字符串是不是包含有效的 C# 代码

如何在 C# 中正确检查 HttpResponseMessage 的 http 状态代码?

如何检查是不是在 C# 中安装了 Windows 服务

如何检查文件是不是在 C# 中签名? [关闭]