MacOS Big Sur下dotnet publish生成SingleFile可执行文件时.dylib文件未嵌入的问题求助
解决MacOS下.NET 5单文件可执行文件无法独立运行的问题
我来帮你搞定这个问题——你碰到的情况是.NET 5单文件发布的默认行为导致的:在.NET 5中,使用PublishSingleFile=true发布时,原生的.dylib库并不会被打包进单个可执行文件,而是留在发布目录里作为独立文件存在。这就是为什么你只复制主程序到其他目录会报错找不到依赖库的原因。
解决方案1:修改发布命令
直接在发布命令里加上-p:IncludeNativeLibrariesForSelfExtract=true参数,让打包工具把所有必要的原生库嵌入到单文件中:
dotnet publish -r osx.11.0-x64 -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true --self-contained true
这个命令会把所有依赖的.dylib文件打包进生成的Hello可执行文件里,运行时程序会自动将这些库提取到临时目录使用,这样你就可以单独复制这个可执行文件到任意OSX 11.0环境运行了。
解决方案2:修改项目配置文件(.csproj)
如果你不想每次发布都手动加命令行参数,可以直接在你的.csproj文件的<PropertyGroup>节点里添加以下配置:
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
修改后的完整配置如下:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net5.0</TargetFramework> <RuntimeIdentifiers>osx.11.0-x64</RuntimeIdentifiers> <SelfContained>true</SelfContained> <PublishReadyToRun>true</PublishReadyToRun> <IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract> </PropertyGroup> </Project>
之后再执行你原来的发布命令,就能生成真正独立的单文件可执行文件了。
补充说明
这个行为在.NET 6及以后的版本里已经默认调整,原生库会自动被包含进单文件,但因为你使用的是.NET 5,所以需要手动添加这个参数来实现完全独立的单文件发布。
内容的提问来源于stack exchange,提问作者Eric




