dotnet
编译器生成相同可执行文件的两个副本,而我的谷歌技能不足以找出原因。
例如在一个简单的控制台项目中:
dotnet publish --configuration Release
生成 bin/Release/net8.0/FizzBuzz 和 bin/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
关于为什么一个可执行文件有两个副本,请参见this答案:
在将二进制文件复制到输出目录之前构建项目。您在 bin\Release 中看到的文件 etcoreapp2.0\win-x64 目录是 dotnet build 命令的结果。您可以通过运行以下命令来检查它:dotnet publish
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
命令执行。