长久以来的认知,对于托管代码 .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 发布。

C#开发,.NET生成单文件运行程序相关推荐

  1. 打造史上最小尺寸.Net Core单文件应用程序

    .Net Core支持将应用程序发布成单文件进行部署和分发. 以下示例将Windows应用作为独立的单文件应用程序发布: dotnet publish -r win-x64 -c Release /p ...

  2. jdk12源代码文件_在JDK 11中启动单文件源代码程序

    jdk12源代码文件 JEP 330 –启动单文件源代码程序是即将发布的JDK 11(18.9)发行版中令人兴奋的功能之一. 此功能允许直接使用java解释器执行Java源代码. 源代码在内存中编译, ...

  3. 在JDK 11中启动单文件源代码程序

    JEP 330 –启动单文件源代码程序是即将发布的JDK 11(18.9)发行版中令人兴奋的功能之一. 此功能允许直接使用java解释器执行Java源代码. 源代码在内存中编译,然后由解释器执行. 限 ...

  4. python生成exe文件运行闪退解决方法

    ** python生成exe文件运行闪退解决方法: ** 使用pyinstaller生成.exe文件: pyinstaller -F filename.py 用python写了一个程序,在python ...

  5. IOS开发基础之单文件上传基础最原始的方式

    IOS开发基础之单文件上传基础最原始的方式 info.plist 加入一行代码 <key>NSAppTransportSecurity</key><dict>< ...

  6. Windows7中双击py文件运行程序

    最近看了一本python方面的教材,洋洋洒洒写了好几页,也没将要点讲到,我现将在Window7下,双击py文件运行程序的方法总结如下: 方法 将该文件的Properties设置为如下: 注意:别忘了在 ...

  7. Arduino生成ATmega8的运行程序并下载

    简 介: 使用另外的ATmega8的Bootloader对ATmega8进行编程,仅仅利用Arduino IDE完成对于Scratch的编译,基于这个模式完成程序的开发. 关键词: Arduino,I ...

  8. java 生成dump文件_程序自动生成Dump文件

    前言:通过drwtsn32.NTSD.CDB等调试工具生成Dump文件,drwtsn32存在的缺点虽然NTSD.CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD.CDB等调试工具.了解了m ...

  9. qt先生成json文件后程序启动时读取json文件在一组数据模拟下正常,换一组数据就出现乱码

    提要 程序编号后自己模拟的数据程序在生成和解析json时都正常,但是换了一组数据,生成的json文件中部分中文乱码,且出现json文件的格式被混乱的现象. 效果 上述出现的不正确的json文件,如下: ...

最新文章

  1. 结对编程-马尔科夫链作业成绩
  2. web常见几种处理图标方法 【转】
  3. Python中递归的最大次数
  4. Linux LXR 网站
  5. 【蓝桥杯Java_C组·从零开始卷】第二节(附)、if与switch效率比较(千万次/一亿次)
  6. 【总结整理】JavaScript的DOM事件学习(慕课网)
  7. linux shell脚本 删除指定目录下文件夹(可指定文件夹名、时间)
  8. Java集合框架知识点
  9. 人工智能-动物识别专家系统Python实现
  10. 如何查计算机版本,如何查看电脑ie浏览器版本呢
  11. ofd阅读器qt_采用WPF技术,开发OFD电子文档阅读器
  12. 新玺配资:板块轮动加快 多看少动均衡配置为主
  13. [闲聊篇]这个世界所谓的28定律
  14. android手机截图功能,安卓手机怎么截屏?三星/华为/小米等手机截图方法
  15. 电影学英语系列:双字幕电影
  16. rono在oracle的作用_Ronopterin (VAS203) 在中重度创伤性脑损伤患者中的疗效 (NOSTRA III 期试验): 一项验证性、安慰剂对照、随机、双盲、多中心研究。...
  17. win10虚拟内存的设置
  18. Qt编写地图综合应用49-地图类型(街道图、卫星图)
  19. Docker部署笔记--Redis集群主从容错切换迁移
  20. 华三交换机IRF堆叠配置及MAD配置

热门文章

  1. web2py基础教程(2)
  2. 王者荣耀s10服务器维护,王者荣耀S10:即将被修复的29大bug,有你想知道的吗?...
  3. Python 炫技操作(01):条件语句的七种写法
  4. codeforces 670C Cinema
  5. OMAP3530显示输出控制
  6. 流媒体之从零实现搭建简单流媒体服务器,推流,拉流播放全景视频
  7. redux简单使用 逆战班
  8. Solidworks联合gazebo搭建仿真环境
  9. oracle nls_lang gbk,导入导出oracle字符集问题——NLS_LANG 参数
  10. Lichee Zero SPI Flash编译实战记录