You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8 AOT发布后Roslyn脚本API操作不支持问题求助

问题分析与解决方案

核心原因

Roslyn的CSharpScript.EvaluateAsync依赖.NET运行时的JIT(即时编译)能力,而PublishAOT发布会彻底移除JIT相关组件,将所有代码提前编译为原生机器码,动态编译脚本的场景在AOT环境下本身就不被支持,因此抛出Operation is not supported on this platform.异常。

可行解决方案

1. 放弃AOT发布(最直接)

如果动态脚本是核心需求,直接关闭项目的PublishAOT配置,改用常规的自包含发布或框架依赖发布模式,Roslyn脚本功能即可正常工作。

2. 替换动态脚本方案(AOT场景推荐)

将动态脚本逻辑替换为静态预编译实现:

  • 源代码生成器:在编译时生成所需业务逻辑代码,替代运行时动态编译。
  • 预编译程序集:把常用脚本逻辑提前编译为独立.NET程序集,运行时通过Assembly.LoadFrom加载调用。
  • 表达式树替代:若脚本逻辑简单(如数值计算、属性访问),可使用System.Linq.Expressions.Expression构建表达式树,AOT对表达式树有有限支持(复杂场景仍可能受限)。

以你的测试场景为例,访问静态类Foo的逻辑完全可以直接写在代码里,无需动态脚本:

// 直接调用静态类,替代脚本逻辑
Console.WriteLine(Foo.Number);
Console.WriteLine(Foo.Text);

3. 启用AOT+部分JIT(预览特性,谨慎使用)

.NET 8提供预览特性TieredCompilationAot,允许AOT发布的应用保留部分JIT编译能力,但这是未稳定的功能,会增加发布包体积、削弱AOT的性能优势,且不一定完全兼容Roslyn脚本的所有场景。

启用方式:在项目文件中添加以下配置:

<PropertyGroup>
  <PublishAot>true</PublishAot>
  <TieredCompilationAot>true</TieredCompilationAot>
  <EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>

最佳实践

  • 若追求AOT的启动速度、部署体积优势,避免在主应用中使用动态编译/脚本功能,提前将所有逻辑静态化。
  • 必须使用动态代码时,拆分架构:将动态脚本部分做成独立的非AOT服务,主AOT应用通过进程间通信(如gRPC、管道)调用该服务。
  • 优先评估动态脚本的必要性,尽可能用配置文件、规则引擎等静态方案替代动态编译场景。

内容的提问来源于stack exchange,提问作者3HMonkey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 08:04:57