作者:安乐乐520 | 来源:互联网 | 2023-09-17 13:42
c#
当我dotnet publish
使用 Mac 在控制台应用程序上运行时,结果.dll
在bin/Debug//publish
目录中。
当我使用 Microsoft .NET SDK Docker 容器在相同的源代码上运行相同的命令时,结果是一个可执行的二进制文件,除了.dll
.
为什么会有差异?为什么不在dotnet publish
macOS 上生成可执行的二进制文件?
我已经使用 .NET Core 3.1 和 .NET 5.0 进行了尝试,并得到了相同的结果。这是我的 .NET 5.0 进程:
首先,我跑dotnet new console
从头开始生成一个新项目。我在生成的输出中没有改变任何东西。生成的.csproj
看起来像这样:
Exe
net5.0
MyApp
dotnet publish
从 macOS运行会产生以下结果:
$ dotnet publish
Microsoft (R) Build Engine version 16.8.3+39993bd9d for .NET
Copyright (C) Microsoft Corporation. All rights reserved.
Determining projects to restore...
Restored /src/my-app.csproj (in 68 ms).
my-app -> /src/bin/Debug/net5.0/my-app.dll
my-app -> /src/bin/Debug/net5.0/publish/
$ ls -al bin/Debug/net5.0/publish/
total 56
drwxr-xr-x 6 user staff 192B Feb 17 09:49 ./
drwxr-xr-x 9 user staff 288B Feb 17 09:49 ../
-rw-r--r-- 1 user staff 409B Feb 17 09:49 my-app.deps.json
-rw-r--r-- 1 user staff 4.5K Feb 17 09:49 my-app.dll
-rw-r--r-- 1 user staff 9.2K Feb 17 09:49 my-app.pdb
-rw-r--r-- 1 user staff 139B Feb 17 09:49 my-app.runtimeconfig.json
dotnet publish
从 Docker 容器内部运行会产生以下结果:
$ docker run -it --mount src="$(pwd)",target=/src,type=bind mcr.microsoft.com/dotnet/sdk:5.0
root@d143004612a8:/src# dotnet publish
Microsoft (R) Build Engine version 16.8.3+39993bd9d for .NET
Copyright (C) Microsoft Corporation. All rights reserved.
Determining projects to restore...
Restored /src/my-app.csproj (in 99 ms).
my-app -> /src/bin/Debug/net5.0/my-app.dll
my-app -> /src/bin/Debug/net5.0/publish/
root@d143004612a8:/src# ls -al bin/Debug/net5.0/publish/
total 164
drwxr-xr-x 7 root root 224 Feb 17 16:53 .
drwxr-xr-x 10 root root 320 Feb 17 16:53 ..
-rwxr-xr-x 1 root root 138736 Feb 17 16:53 my-app
-rw-r--r-- 1 root root 409 Feb 17 16:53 my-app.deps.json
-rw-r--r-- 1 root root 4608 Feb 17 16:53 my-app.dll
-rw-r--r-- 1 root root 9304 Feb 17 16:53 my-app.pdb
-rw-r--r-- 1 root root 139 Feb 17 16:53 my-app.runtimeconfig.json
所以我的问题是:给定同一个项目,为什么一个输出可执行二进制文件,而另一个不输出?
回答
由于 macOS 公证要求,应用程序主机可执行文件生成在 macOS 上默认关闭
您可以通过将UseAppHost
属性设置True
为构建属性-p:UseAppHost=True
或在 csproj 文件中手动覆盖它:
True