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

树莓派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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:07:24