好久没写文章了,有些同学问我公众号是不是废了?其实并没有。其实想写的东西很多很多,主要是最近公司比较忙,以及一些其他个人原因没有时间来更新文章。这几天抽空写了一点点东西,证明公众号还活着。

长久以来的认知,对于托管代码 .NET / JAVA ,都是需要在服务器上安装 SDK 或者运行时的。比如 .NET Framework 4.XX ,JDK/JRE.XX 等。其实从 .NET Core 2.1 开始我们的 .NET 程序可以独立打包成可以执行文件,在服务器上根本不需要安装任何运行时相关的东西就可以运行。这个发布模式在某些情况下可以大大提高部署的效率。以下简单介绍一下。

“独立”部署模式

在发布界面部署模式选择“独立”,点击保存之后然后正常发布。等到发布完成之后,查看 publish 目录,可以发现里面生成了一大堆文件,数量有上百个。这里其实就包含了 runtime 相关的文件。



我们把这堆文件全部复制到某个未安装过 .NET SDK 或者 runtime 的 windows 服务器上,找到 SelfContainedTest.exe 文件,双击运行。如果一切顺利,会启动一个控制台。



访问一下服务器的 5000 口,看到测试数据被成功的输出了,证明我们的 .NET 程序可以正常运行了 。

单文件

上面的操作我们已经可以不安装运行时在服务器上运行 .NET 程序了。但是那么多文件看着不太优雅,下面让我们的 .NET 程序打包成一个文件。

打开发布设置界面,勾上“生成单个文件”



点击保存,发布之后,在 publish 目录可以看到只剩下 6 个文件了。排除配置文件,pdb 文件等,其实真正的程序只是 SelfContainedTest.exe 文件,所以称之为单文件。双击这个文件我们的程序就可以正常的运行了。

裁剪

以上我们已经把程序从多个文件打包成一个文件了。这个文件我们可以看到有 70 M ,对于我们一个简单的演示程序来说 70M 也挺大了。那么有什么办法来缩小我们的可以执行文件吗?

其实我们只要在发布配置上打开裁剪功能,就可以缩小我们的程序。



在发布配置界面勾上“裁剪未使用的代码”,点击保存,发布之后,在 publish 文件夹下面生成的 SelfContainedTest.exe 文件缩小到了 30M 左右。

裁剪的注意点

这里大概说一下裁剪的原理。当我们使用裁剪功能的时候,发布程序会开始分析我们的代码,哪些类被使用,哪些类没有使用,没有使用的类就会被删除掉,使用这样的原理来减小发布后程序集的大小。

但是以上方法显然会有一个问题,那就是无法识别动态性很强的代码,比如反射实现的某些功能。比如以下代码:

string s = Console.ReadLine();
Type type = Type.GetType(s);
foreach (var m in type.GetMethods())
{
Console.WriteLine(m.Name);
}

显然以上代码静态分析没办法知道程序最终需要使用那些类,因为目标类是通过 Console.ReadLine 方法输入进去的。在程序没有执行的时候谁也不知道哪些类会被使用。

在 IIS 上运行

上面我们演示程序运行的时候是寄宿在控制台上的,这样的话很容易被人误关闭。其实单文件发布的程序照样可以使用 IIS 来托管。

按照正常的 IIS 发布网站的流程配置之后,把应用程序池设置为 “无托管代码” 访问对应的端口程序就可以正常运行了。

在 linux 上运行

以上我们都是在 windows 上测试,现在让我们试一下在 linux 上运行它。

在 linux 上运行的话,需要在发布配置界面修改“目标运行时”为 linux-64 。



发布成功后把生成的文件复制到 linux 服务器上。cd 到目录,运行以下代码。

chmod +x SelfContainedTest
./SelfContainedTest

很不幸,我们的程序没有按计划运行起来。



通过搜索后发现,需要设置一个环境变量。修改运行的代码:

export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
./SelfContainedTest

运行完之后我们的程序应该会顺利的启动。访问一下对应的 http 接口,可以看到正确的输出了。

总结

通过以上演示,我们根本没必要在服务器(windows/linux)上安装任何 SDK 或者运行时就可以完整的运行我们的 .NET 程序。而且通过裁剪之后我们的程序的大小也缩小到了一个很小的范围。以上功能对于互联网行业来说可能没什么必要,毕竟大家走的都是容器化部署,服务器上本来就不需要安装运行时。但是对于一些传统行业,比如医院这样的环境,还有很多需要在服务器上人肉部署的场景。在这些场景之下就非常有意义了,可以大大的体高部署的效率。毕竟不是谁都可以很快的在服务器上安装好运行时,特别是 linux 服务器。

其实不安装运行时来运行程序还有一个办法,那就是使用 AOT 发布,这个我们下次再讲。

关注我的公众号一起玩转技术

不安装运行时运行.NET程序的更多相关文章

  1. 不安装运行时运行 .NET 程序 - NativeAOT

    大家好,先祝大家国庆快乐.不过大家看到这篇文章的时候估计已经过完国庆了 . 上一篇我们写了如何通过 SelfContained 模式发布程序(不安装运行时运行.NET程序)达到不需要在目标机器上安装 ...

  2. windows批处理运行java程序

    明确需求 今天你编了一个java swing版照片查看器,想让计算机上的所有照片默认打开方式都改成你的照片查看器. 使用工具软件 很多工具软件都是不把jre打包到exe中的,这就是说打包之后的exe只 ...

  3. Windows 搭建 .NET 跨平台环境并运行应用程序

    写在前面 阅读目录: Install .NET Version Manager (DNVM) Install .NET Core Execution Environment (DNX) Write t ...

  4. 如何使用sublime编辑器运行python程序

    现在越发喜欢sublime编辑器了,不仅界面友好美观.文艺,可扩展性还特别强. sublime本身是不具备运行python程序的能力的,需要做些设置才可以.以下是安装好sublime后设置的步骤: 点 ...

  5. 使用ToolRunner运行Hadoop程序基本原理分析

    为了简化命令行方式运行作业,Hadoop自带了一些辅助类.GenericOptionsParser是一个类,用来解释常用的Hadoop命令行选项,并根据需要,为Configuration对象设置相应的 ...

  6. Scrapy:运行爬虫程序的方式

    Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0, 在创建了爬虫程序后,就可以运行爬虫程序了.Scrapy中介绍了几种运行爬虫程序的方式,列举如下: -命令行工具之s ...

  7. 从终端运行python程序

    终端窗口运行.py程序 首先你要安装python,命令行输入 python 有python提示符 >>> 出现说明安装成功 程序第一行应该是 #! python3 #! python ...

  8. 使用ToolRunner运行Hadoop程序基本原理分析 分类: A1_HADOOP 2014-08-22 11:03 3462人阅读 评论(1) 收藏

    为了简化命令行方式运行作业,Hadoop自带了一些辅助类.GenericOptionsParser是一个类,用来解释常用的Hadoop命令行选项,并根据需要,为Configuration对象设置相应的 ...

  9. C:\Program不是内部或外部命令,也不是可运行的程序或批处理文件。

    问题描述:C:\Program不是内部或外部命令,也不是可运行的程序或批处理文件. 解决办法:C:\"Program Files"\具体文件目录. 具体场景:在cmd或者批处理文件 ...

随机推荐

  1. declare-声明限定类型变量

    用于声明变量并设置变量的属性. 语法 declare [+/-][rxi][变量名称=设置值] declare -f 特殊符号 +/- "-"可用来指定变量的属性,"+& ...

  2. python目录索引

    python目录索引 python基础数据类型1 目录 part1 part2 运算符 格式化 part3 字符串 字符串常用操作方法 part4 列表 列表的创建: 列表的索引,切片 列表的增删改查 ...

  3. Beyond Compare文件对比神器,快来给文件找茬!

    在工作中很多场景下都需要比对两个文件之间的差异,你是否还傻傻的同时打开两个文件,用眼睛一行一行的核对? 赶紧来试试这个神器Beyond Compare!!它可以快速的帮你找出两个文件的差异,而且还有其 ...

  4. Solon 1.8.0 发布,云原生微服务开发框架

    相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...

  5. Microsoft Office 代码执行漏洞临时防范方法

    一.删除ms-msdt URI 注册表 1.按下键盘上的快捷组合键:win键 和 R键,打开运行(也可以在开始菜单打开运行). 2.在运行窗口中输入命令:regedit,点击确定或敲回车键就可以快速打 ...

  6. ngx_http_fastcgi_module 的那些事

    是什么? 顾名思义,是Nginx用来处理FastCGI的模块.FastCGI是什么?这个以后再讲,可以说的是现在LNMP架构里面,PHP一般是以PHP-CGI的形式在运行,它就是一种FastCGI,我 ...

  7. 开发工具-Typora编辑器下载地址

    更新记录 2022年6月10日 完善标题. 比较好用的Markdown编辑器了,哈哈. https://typoraio.cn/

  8. SRE,了解一下?35+岁程序员新选择

    摘要:随着云业务的发展,今后会有越来越多的工程师深入到SRE领域. 本文分享自华为云社区<浅谈SRE角色认知>,作者: SRE确定性运维. 一.什么是SRE? SRE(Site Relia ...

  9. ESXI系列问题整理以及记录——使用SSH为设备打VIB驱动包,同时提供一种对于ESXI不兼容螃蟹网卡(Realtek 瑞昱)的问题解决思路

    对于ESXI不兼容螃蟹网卡的问题,这里建议购买一张博通的低端单口千兆网卡,先使用博通网卡完成系统部署,再按照下文方法添加螃蟹网卡的VIB驱动,最后拆除博通网卡. 螃蟹网卡VIB驱动包下载地址:http ...

  10. Vuex的各个模块封装

    一.各个模块的作用: state 用来数据共享数据存储 mutation 用来注册改变数据状态(同步) getters 用来对共享数据进行过滤并计数操作 action 解决异步改变共享数据(异步) 二 ...