如何在 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 服务是不是已启动并正在运行?
在 C# 中以编程方式检查字符串是不是包含有效的 C# 代码