.NET8 AOT报错:System.IO.FileNotFoundException: Could not find file 'Microsoft.AspNetCore'
AOT在Visual Studio中运行是没有问题,但要采用默认的发布配置就会报错。首先,如果采用默认发布,目标运行时的默认配置是“可移植”,会报一个错,如下图:
我们知道AOT机制是生成本机执行码,所以这里的“可移植”不正确,应该准确选择对应的平台,本例中是windows,目前的AOT不支持x32,所以选择x64。
然后再次运行发布,系统会提示发布成功,但当运行程序时,应用会提示打不到Microsoft.AspNetCore,具体错误如下:
Unhandled Exception: System.IO.FileNotFoundException: Could not find file 'Microsoft.AspNetCore'.
即然发布成功,怎么还能找不到文件,并且是Microsoft.AspNetCore文件,按理这个Nuget包在很早的版中就不用了,这里很容易就引导去找少文件或怀疑环境出错了。毕竟发布成功,运行有问题。其实如果仔细观察的话,虽然发布成功了,但有一行发布时的命令行提示:ILC: Method '[AOTDemo01_dotnet8]Program.<Main>$(string[])' will always throw because: Failed to load assembly 'Microsoft.AspNetCore',其实在发布时,就提示找不到Microsoft.AspNetCore,但这次提示的是命名空间,所以间接说发布是失败的。
看到这个信息,估计就怀疑环境有问题了,毕竟AOT发布的是本机代码吗。那就要继续看发布配置了。这时,“部署模式”选项是“框架依赖”,这时你应该能对得上了,因为AOT不可能再依赖asp.net core的运行时,所以这里如果不改,那就是找包时不包含这部分,所以发布出去的应用自然缺少Microsoft.AspNetCore的命名空间了。“部署模式”切换成“独立”,再次发布,成功了,并且能正常运行。这时,你就能美美得到一个15.5M的exe。
所以Visual Studio可以判断是AOT项目,在发布文件里,自动把不支持的目标框架和目标运行时隐藏就更好了。
另外,在终端命令行里,用dotnet publish -r win-x64发布,可以直接成功,看来还是命令行无敌呀,命令行的默认发布地址是:bin\Release\net8.0\win-x64\publish。
更新于:2个月前相关文章
- .NET8和.NET6的区别有哪些?
- .NET8 IPNetwork用法
- 企业项目选择.NET6还是.NET8?
- .NET8 15个新特性
- .NET8 AOT 混淆加壳
- 本机AOT与ASP.NET Core配合使用的优势
- .Net8 AOT有什么新特性
- .NET8 IExceptionHandler用法
- .NET8拦截器Interceptors用法
- .NET8 Blazor三种模式的区别和使用场景
- .NET8是长期维护版本吗?
- .NET8 线程池优化
- .NET7和.NET8的区别
- .NET8使用缓存的几种方法
- .NET8站点报错:HTTP Error 500.31 - Failed to load ASP.NET Core runtime
- .NET8 Blazor的Auto渲染模式
- .NET8.0新特性和改进
- ASP.NET Core 8 MVC在program.cs里设置允许跨域
- .NET8 创建和部署windows服务图文教程