树莓派Linux上dotnet build指定linux-x64运行时失败,报CreateAppHost错误
树莓派Linux上构建.NET项目指定linux-x64运行时失败及权限问题解决
环境与代码情况
已在树莓派Linux上安装.NET 8环境,开发跨Windows和树莓派的控制台项目:
Program.cs代码
// See https://aka.ms/new-console-template for more information Console.WriteLine("Hello, World!"); Console.WriteLine("Press ENTER to exit"); Console.Read();
项目文件(testproject.csproj)
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net8.0</TargetFramework> <RuntimeIdentifiers>win-x64;linux-x64</RuntimeIdentifiers> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> </Project>
构建情况
- 不指定运行时构建(默认输出)正常完成:
pi@raspberrypi:~/Documents/testproject $ dotnet build testproject.csproj Determining projects to restore... All projects are up-to-date for restore. testproject -> /home/pi/Documents/testproject/bin/Debug/net8.0/testproject.dll
- 指定
--runtime linux-x64构建失败,报错:
pi@raspberrypi:~/Documents/testproject $ dotnet build testproject.csproj --runtime linux-x64 Determining projects to restore... All projects are up-to-date for restore. /home/pi/.dotnet/sdk/8.0.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(709,5): error MSB4018: The "CreateAppHost" task failed unexpectedly. [/home/pi/Documents/testproject/testproject.csproj] /home/pi/.dotnet/sdk/8.0.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(709,5): error MSB4018: System.ArgumentException: A positive capacity must be specified for a Memory Mapped File backed by an empty file. [/home/pi/Documents/testproject/testproject.csproj] /home/pi/.dotnet/sdk/8.0.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(709,5): error MSB4018: at System.IO.MemoryMappedFiles.MemoryMappedFile.CreateFromFile(FileStream fileStream, String mapName, Int64 capacity, MemoryMappedFileAccess access, HandleInheritability inheritability, Boolean leaveOpen) [/home/pi/Documents/testproject/testproject.csproj] /home/pi/.dotnet/sdk/8.0.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(709,5): error MSB4018: at Microsoft.NET.HostModel.AppHost.HostWriter.<>c__DisplayClass2_0.<CreateAppHost>b__1() [/home/pi/Documents/testproject/testproject.csproj] /home/pi/.dotnet/sdk/8.0.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(709,5): error MSB4018: at Microsoft.NET.HostModel.RetryUtil.RetryOnIOError(Action func) [/home/pi/Documents/testproject/testproject.csproj] /home/pi/.dotnet/sdk/8.0.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(709,5): error MSB4018: at Microsoft.NET.HostModel.AppHost.HostWriter.CreateAppHost(String appHostSourceFilePath, String appHostDestinationFilePath, String appBinaryFilePath, Boolean windowsGraphicalUserInterface, String assemblyToCopyResourcesFrom, Boolean enableMacOSCodeSign) [/home/pi/Documents/testproject/testproject.csproj] /home/pi/.dotnet/sdk/8.0.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(709,5): error MSB4018: at Microsoft.NET.Build.Tasks.CreateAppHost.ExecuteCore() [/home/pi/Documents/testproject/testproject.csproj] /home/pi/.dotnet/sdk/8.0.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(709,5): error MSB4018: at Microsoft.NET.Build.Tasks.TaskBase.Execute() [/home/pi/Documents/testproject/testproject.csproj] /home/pi/.dotnet/sdk/8.0.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(709,5): error MSB4018: at Microsoft.Build.BackEnd.TaskExecutionHost.Execute() [/home/pi/Documents/testproject/testproject.csproj] /home/pi/.dotnet/sdk/8.0.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(709,5): error MSB4018: at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask(TaskExecutionHost taskExecutionHost, TaskLoggingContext taskLoggingContext, TaskHost taskHost, ItemBucket bucket, TaskExecutionMode howToExecuteTask) [/home/pi/Documents/testproject/testproject.csproj] Build FAILED.
补充测试
使用sudo执行dotnet build时提示sudo: dotnet: command not found,但切换到root用户(su)后可正常编译,疑似权限问题。
解决方案
1. 修正运行时标识符(核心问题)
树莓派为ARM架构,linux-x64是针对x86_64处理器的运行时,树莓派需匹配对应架构的标识符:
- 32位树莓派:
linux-arm - 64位树莓派:
linux-arm64
修改项目文件中的RuntimeIdentifiers:
<RuntimeIdentifiers>win-x64;linux-arm64</RuntimeIdentifiers>
重新构建命令:
dotnet build testproject.csproj --runtime linux-arm64
2. 解决sudo找不到dotnet的问题
sudo默认不加载用户环境变量,dotnet路径仅存在于pi用户的PATH中,可通过两种方式解决:
- 方式一:指定dotnet绝对路径执行
sudo /home/pi/.dotnet/dotnet build testproject.csproj --runtime linux-arm64
- 方式二:修改sudo的secure_path
用visudo命令编辑/etc/sudoers文件,找到secure_path行,添加/home/pi/.dotnet:
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/pi/.dotnet"
保存后sudo即可识别dotnet命令。
3. 清理构建缓存
若之前错误导致缓存异常,先清理再构建:
dotnet clean testproject.csproj dotnet restore testproject.csproj dotnet build testproject.csproj --runtime linux-arm64
内容的提问来源于stack exchange,提问作者CJ Scholten
相关产品推荐
相关产品推荐

