dotnet 生成可执行文件的两个副本

问题描述 投票:0回答:1

dotnet
编译器生成相同可执行文件的两个副本,而我的谷歌技能不足以找出原因。

例如在一个简单的控制台项目中:

dotnet publish --configuration Release
生成 bin/Release/net8.0/FizzBuzzbin/Release/net8.0/publish/FizzBuzz,它们是相同的。

我想构建一个最优化的跨平台可执行文件。我该怎么做?

我知道有不同的构建目标(特定于操作系统、特定于 dotnet SDK 等),但我对许多选项感到困惑。

如果您链接到https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-publish,请提供选项的缺点描述,因为我不明白它们。

我的FizzBuzz.csproj文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <AssemblyName>FizzBuzz</AssemblyName>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <!-- I added 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
.net-core .net-8.0 building
1个回答
0
投票

关于为什么一个可执行文件有两个副本,请参见this答案:

dotnet publish
在将二进制文件复制到输出目录之前构建项目。您在 bin\Release 中看到的文件 etcoreapp2.0\win-x64 目录是 dotnet build 命令的结果。您可以通过运行以下命令来检查它:
dotnet build --configuration Release --runtime win-x64

关于如何发布可执行文件以同时在多个系统上运行:我认为这是不可能的。当您使用

dotnet publish
命令时,它会生成一个特定于操作系统的可执行文件(因此只能在一个操作系统上运行。)因此,您需要发布多个可执行文件以使应用程序跨平台,例如,
dotnet publish --runtime win-x64
(适用于 Windows 64 位)或
dotnet publish --runtime linux-x64
(适用于 Linux 64 位)。或者,使用
dotnet build
生成包含 IL 代码的 dll 文件,该代码可以同时在多个系统上运行,但可能需要使用
dotnet
命令执行。

© www.soinside.com 2019 - 2024. All rights reserved.