如何禁止dotnet publish在Linux下将dll文件标记为可执行文件
禁用dotnet publish在Linux下给DLL加可执行权限的方法
在Linux环境执行dotnet publish时,所有输出的托管DLL被默认标记为可执行权限,是.NET SDK的已知默认行为,从.NET 7 SDK版本开始官方提供了原生配置项可以直接关闭该逻辑,不需要额外执行后置chmod命令。
项目永久生效配置
打开你项目的.csproj文件,在任意<PropertyGroup>节点下添加如下配置即可,后续所有构建、发布操作都不会再给DLL文件自动加可执行位:<UnixSetExecutableBitOnManagedLibraries>false</UnixSetExecutableBitOnManagedLibraries>如果你是通过发布配置文件(
.pubxml)管理发布参数,把上述配置加到对应pubxml文件的PropertyGroup里即可,仅对使用该配置的发布生效。单次发布临时生效
如果不想修改项目文件,可以在执行dotnet publish命令时通过/p参数动态传入该配置,示例:dotnet publish -c Release -r linux-x64 --self-contained true /p:UnixSetExecutableBitOnManagedLibraries=false.NET 6及更早版本处理方案
上述配置项是.NET 7 SDK新增的能力,如果你使用的是.NET 6或更低版本,没有原生开关可以关闭该默认行为,你当前使用的发布后执行chmod -x *.dll的方案是完全可靠的:.NET运行时加载DLL依赖时完全不依赖文件的可执行权限位,移除该权限不会对程序运行造成任何影响。
补充说明:该默认逻辑的初衷是支持用户直接通过
./入口程序.dll的方式在Linux下启动应用(依赖DLL头部的shebang标记和文件可执行位),但SDK早期实现没有区分入口程序集和第三方依赖DLL,粗暴给所有输出DLL加上了可执行位,属于设计上的不合理之处,高版本SDK已经在迭代优化该逻辑。
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

