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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:44:51