正如其他答案所述,Windows上的默认设置是生成一个小型主机可执行文件,启动.NET运行时并加载适当的MSIL程序集。
有趣的一点是,MSIL程序集采用与所有Windows .exe或.dll文件相同的运行时格式(“PE” - 可移植可执行文件)打包。
早期版本的“新.NET”(.NET Core,现在是.NET 5+)只生成了可以在所有平台上运行的.dll文件,并需要用户使用
dotnet theapp.dll
来运行应用程序。
尽管这能够工作,但.NET Core 3.0及更高版本还提供了一个“应用程序主机”程序集作为另一种入口方式。由
dotnet publish
生成的代码仍然跨平台,但另外生成可执行文件具有一些优势:
- 在具有CI / CD流水线或工具期望.exe文件的大型项目中,将传统.NET Framework项目移至.NET Core需要的更改较少。
- 用户更容易在任务管理器/
ps
中找到正确的程序-就像查找正确的java.exe进程一样,拥有数百个
dotnet.exe
进程有点困难。
- 找到或设置
dotnet.exe
或
dotnet
(Linux / macOS)的路径可能很麻烦。通过使用可执行文件,可以在各种位置查找运行时,并且不太依赖于正确设置的PATH环境变量。
- 在Windows上,人们可能希望更改.exe的特定于操作系统的定义,例如:
- 子系统标志(GUI与控制台应用程序):.exe文件中的一个标志控制Windows是否打开控制台窗口。 Java具有
java.exe
和
javaw.exe
用于控制台 vs GUI程序。 .NET Core 3.0+应用程序所需的设置可以由构建过程或项目SDK(例如WinForms、WPF)进行自定义。
- 嵌入式图标:Windows .exe文件可以包含图标。如果您希望您的应用程序(尤其是GUI应用程序)在资源管理器或任务栏中显示图标,则需要实际上可以修改图标的.exe文件。
- 嵌入Win32清单:清单文件可以控制许多东西,例如提升的访问要求(这些.exe文件会提示您允许管理员访问)。再次强调,这是通过
dotnet.exe theapp.dll
无法完成的事情。
请注意,目前在macOS上禁用了此可执行文件生成功能,原因是Apple的认证要求(基本上,您需要签署应用程序,然后苹果需要“验证”它以避免出现警告)。