当前位置: 首页 > news >正文

.NET6 命令行启动及发布单个Exe文件

.NET Core 命令行接口 (CLI) 工具是用于开发、生成、运行和发布 .NET Core 应用程序的跨平台工具链。

CLI 命令结构包含驱动程序(“dotnet”)和命令,还可能包含命令参数和选项。

话不多说,下面我们进入本章主题:

首先我们来建个MVC的项目(目标框架:.NET Core 3.1),如下所示:

进入项目文件.csproj所在的目录

输入cmd后按Enter键就可以快速进入到指定目录

dotnet run //.NET Core CLI命令 无需任何显式编译或启动命令即可运行源代码。

这样子就算是启动成功了,使用dotnet run命令启动默认端口号是launchSettings.json中设置的5000

我们使用5000端口在浏览器中访问看下是否真的启动成功了

可以看到确实是启动成功了

此时我们可以按Ctrl + C来停止程序,停止成功如下所示:

此时你如果不想使用5000端口,可以使用--urls命令参数来指定具体的端口,例如:

dotnet run --urls=http://*:8080

同样的操作可以多开几个命令行窗口,这样子就可以做到同一套代码,启动不同进程,监听不同端口,以此来模拟集群了,如下所示。

上面我们开了2个cmd界面,分别启动了一个实例,端口号分别为8080和8081,下面我们就可以使用这2个端口号访问了

可以发现我们用这2个端口号都访问成功了

此外还可以运行指定的项目

dotnet run -p NETCoreCLI.csproj //一个“-”是简称的p
dotnet run --project NETCoreCLI.csproj //两个“-”是全称的project

此处输入NETCoreCLI.csproj有个小技巧,就是输入一个N后按Tab键就会自动补齐,这样子就不用一个个字输入了。

PS:需要特别注意的是上面介绍的启动方式,一旦修改了程序代码则都需要使用Ctrl+C停止后重新启动。

当然有个小技巧就是加watch自动监听程序代码的修改,一旦修改了代码就会自动重启。

dotnet watch run -p NETCoreCLI.csproj --urls=http://*:8080

此外还有一个命令主要是用来启动发布后的应用,如下所示:

PS:使用该命令启动的方式,一旦修改了代码就需要停止,然后重新生成发布,最后重新启动。

dotnet [解决方案bin文件下的dll文件] --urls=http://*:8080

dotnet NETCoreCLI.dll --urls=http://*:8080

如果使用该命令直接启动没有发布的应用则可能有些资源文件就访问不到了,如下:

此时虽然可以启动成功但是有些资源访问不到,如下所示:

故该命令主要是用来启动发布后的应用,如下所示:

首先我们将项目发布下,点击项目 => 右键 => 选择发布

选择IIS、FTP等

选择文件系统

然后进行发布

最后使用命令启动发布后的应用

可以看到启动成功了

PS:

使用命令行方式启动程序同样也是可以支持附加到进程进行调试的。可以尝试将w3wp.exe或者dotnet.exe又或者是应用程序.exe附加到进程进行调试。

其中应用程序.exe如下所示:

本文涉及到的.NET Core CLI命令小结

dotnet run
dotnet run --urls=http://*:8080  //urls指定ip和端口
dotnet watch run  //watch监听程序修改,一旦修改则重新启动
dotnet watch run --urls=http://*:8080
dotnet run -p NETCoreCLI.csproj  //一个“-”是简称的p
dotnet run --project NETCoreCLI.csproj  //两个“-”是全称的project
dotnet watch run -p NETCoreCLI.csproj --urls=http://*:8080
dotnet [解决方案bin文件下的dll文件] --urls=http://*:8080
dotnet NETCoreCLI.dll --urls=http://*:8080
dotnet clean  //清除项目的默认生成,与VS中的右键清理效果是一样的
Ctrl + C  //停止
cls  //清除屏幕
Tab键  //自动补齐

详细的.NET Core CLI可参考官网:https://docs.microsoft.com/zh-cn/dotnet/core/tools/dotnet-run

在.NET 6.0中发布单个Exe文件(PublishSingleFile)

假设我有一个简单的“ Hello World”控制台应用程序,我想发送给朋友来运行。朋友没有安装.NET Core,所以我知道我需要为他构建一个独立的应用程序。很简单,我只需在项目目录中运行以下命令:

dotnet publish -r win-x64 -c Release --self-contained

朋友是多少位的操作系统,你就标记要发布成什么样子的, --self-contained这个标签的解释自包含,就是说你的相关依赖项与你的应用程序不挂钩,将会产生依赖,缺少一个dll就会缺胳膊少腿。所以这样你就必须将整个文件夹都托给朋友。 

 看看文件夹里的情况,它会发生什么?293个文件,这直接将.NET Core的运行时也打包了,这非常Nice!不过我这文件真的很多,我很难受!朋友会说:这什么鬼?exe在哪里?

 所以.NET Core给我们提供了一个命令标志, dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true 您会注意到,我们不再指定自包含标志。这是因为假设如果您将其打包为单个exe,则将需要它的所有依赖关系。这一定说得通。我们试着去运行该命令。随后打开publish文件,我们发现!这也太干净了吧! 但是文件还是有点大呀,这可只是一个Hello World呀!,我们在思考如何进行优化大小,当然这一点微软也给我们考虑到了!!!

使用命令 dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true /p:PublishTrimmed=true 我们拭目以待吧。

不通过DotCli发布可以修改一下项目文件,再通过VisualStudio发布!

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
    <RuntimeIdentifier>win10-x64</RuntimeIdentifier>//发布平台
    <PublishSingleFile>true</PublishSingleFile>//是否单个exe
  </PropertyGroup>
  <PropertyGroup>
    <PublishTrimmed>true</PublishTrimmed>//启用压缩
  </PropertyGroup>
</Project>

相关文章:

  • 如何破坏开发板iNand中的uboot?
  • 【数据库】Redis(数据类型、跳跃表、持久化、分布式锁、雪崩击穿、淘汰策略等)面试题
  • 如何在 Java 中使用 MQTT
  • 网络编程(二)- 检查网络的工具
  • EN 14783屋顶、外覆层和内衬用全支撑金属薄板和带材—CE认证
  • 孙卫琴的《精通Vue.js》读书笔记-分割setup()函数
  • 哈希表、集合、映射
  • webpack5 之 css与js相关
  • 最新总结MySQL核心知识点
  • Servlet 项目的创建和部署
  • android获取进程内存使用信息、一键加速(内存清理)与进程重要级别解析
  • 面试题之HashMap与HashTable的区别
  • ASEMI整流桥SKBPC3516,SKBPC3516参数,SKBPC3516应用
  • java固定资产设备管理系统(源码开源分享)
  • 计算机网络学习笔记
  • classpath对获取配置文件的影响
  • express + mock 让前后台并行开发
  • js递归,无限分级树形折叠菜单
  • MQ框架的比较
  • Nodejs和JavaWeb协助开发
  • Protobuf3语言指南
  • Solarized Scheme
  • Travix是如何部署应用程序到Kubernetes上的
  • 服务器之间,相同帐号,实现免密钥登录
  • 给Prometheus造假数据的方法
  • 关于extract.autodesk.io的一些说明
  • 诡异!React stopPropagation失灵
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 记一次和乔布斯合作最难忘的经历
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 力扣(LeetCode)22
  • 温故知新之javascript面向对象
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • hi-nginx-1.3.4编译安装
  • 昨天1024程序员节,我故意写了个死循环~
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (ros//EnvironmentVariables)ros环境变量
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)windows配置JDK环境
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (接口自动化)Python3操作MySQL数据库
  • (图)IntelliTrace Tools 跟踪云端程序
  • (一)WLAN定义和基本架构转
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • .NET 4.0中的泛型协变和反变
  • .Net环境下的缓存技术介绍
  • .net专家(张羿专栏)
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @AutoConfigurationPackage的使用
  • @基于大模型的旅游路线推荐方案