dotnet发布生成两份相同可执行文件,如何构建优化版与跨平台版?
使用dotnet编译时生成两份相同可执行文件的问题及需求
问题现象
使用dotnet编译器时会生成两份完全相同的可执行文件,找不到原因。
示例场景
在一个简单的控制台项目中,执行dotnet publish --configuration Release后,会生成bin/Release/net8.0/FizzBuzz和bin/Release/net8.0/publish/FizzBuzz,二者完全一致。
核心需求
希望构建一个针对当前平台的优化可执行文件,以及一个跨平台可执行文件,该如何操作?
编辑补充内容
感谢@winscripter,摸索出以下内容:
执行dotnet publish -c .会生成如下文件结构:
bin/net8.0/ ├── FizzBuzz (可执行文件) ├── FizzBuzz.deps.json (用途未知) ├── FizzBuzz.dll (跨平台IL代码) ├── FizzBuzz.pdb (调试符号) ├── FizzBuzz.runtimeconfig.json (非独立运行所需) └── publish/ (上述文件的副本)
FizzBuzz可执行文件需要依赖FizzBuzz.dll和FizzBuzz.runtimeconfig.json,可通过./bin/net8.0/publish/FizzBuzz直接执行。FizzBuzz.dll可通过dotnet bin/net8.0/publish/FizzBuzz.dll跨平台运行,仅需FizzBuzz.runtimeconfig.json作为依赖。
其余生成文件并非程序运行所必需。
确定在未指定dotnet的runtime选项时,默认的优化构建是针对当前平台(即Linux)的。因为ldd命令显示其依赖Linux特定库:
ldd bin/net8.0/publish/FizzBuzz linux-vdso.so.1 (0x00007ffd260e0000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe955acd000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe955ac8000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fe955800000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe95571e000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fe955a9b000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe955539000) /lib64/ld-linux-x86-64.so.2 (0x00007fe955b05000)
后续困惑
了解存在不同的构建目标(如特定操作系统、dotnet SDK特定等),但众多选项让人困惑。若引用官方文档,请说明各选项的缺点,因为无法理解这些内容。
项目文件内容
我的FizzBuzz.csproj文件内容如下:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <AssemblyName>FizzBuzz</AssemblyName> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <!-- 我添加了ErrorOnDuplicatePublishOutputFiles --> <ErrorOnDuplicatePublishOutputFiles>true</ErrorOnDuplicatePublishOutputFiles> </PropertyGroup> </Project>
我添加了<ErrorOnDuplicatePublishOutputFiles>尝试改变现状,但没有效果。
环境信息
dotnet --version 8.0.301 uname -a Linux kali 6.8.11-amd64 #1 SMP PREEMPT_DYNAMIC Kali 6.8.11-1kali2 (2024-05-30) x86_64 GNU/Linux
内容的提问来源于stack exchange,提问作者dotnetCarpenter
相关产品推荐
相关产品推荐

