首页 > 编程语言 >不安装运行时运行.NET程序

不安装运行时运行.NET程序

时间:2024-08-06 11:49:23浏览次数:16  
标签:文件 程序 linux 服务器 NET 安装 运行

好久没写文章了,有些同学问我公众号是不是废了?其实并没有。其实想写的东西很多很多,主要是最近公司比较忙,以及一些其他个人原因没有时间来更新文章。这几天抽空写了一点点东西,证明公众号还活着。
长久以来的认知,对于托管代码 .NET / JAVA ,都是需要在服务器上安装 SDK 或者运行时的。比如 .NET Framework 4.XX ,JDK/JRE.XX 等。其实从 .NET Core 2.1 开始我们的 .NET 程序可以独立打包成可以执行文件,在服务器上根本不需要安装任何运行时相关的东西就可以运行。这个发布模式在某些情况下可以大大提高部署的效率。以下简单介绍一下。

“独立”部署模式

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

不安装运行时运行.NET程序_.net

 

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

不安装运行时运行.NET程序_服务器_02

不安装运行时运行.NET程序_服务器_03

 

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

不安装运行时运行.NET程序_linux_04

单文件

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

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

不安装运行时运行.NET程序_.NET Core_05

 

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

不安装运行时运行.NET程序_.NET Core_06

裁剪

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

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

不安装运行时运行.NET程序_服务器_07

 

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

不安装运行时运行.NET程序_.NET Core_08

裁剪的注意点

这里大概说一下裁剪的原理。当我们使用裁剪功能的时候,发布程序会开始分析我们的代码,哪些类被使用,哪些类没有使用,没有使用的类就会被删除掉,使用这样的原理来减小发布后程序集的大小。
但是以上方法显然会有一个问题,那就是无法识别动态性很强的代码,比如反射实现的某些功能。比如以下代码:

string s = Console.ReadLine();
Type type = Type.GetType(s);
foreach (var m in type.GetMethods())
{
Console.WriteLine(m.Name);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

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

在 IIS 上运行

上面我们演示程序运行的时候是寄宿在控制台上的,这样的话很容易被人误关闭。其实单文件发布的程序照样可以使用 IIS 来托管。
按照正常的 IIS 发布网站的流程配置之后,把应用程序池设置为 “无托管代码” 访问对应的端口程序就可以正常运行了。

不安装运行时运行.NET程序_linux_09

在 linux 上运行

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

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

不安装运行时运行.NET程序_.net_10

 

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

chmod +x SelfContainedTest
./SelfContainedTest
  • 1.
  • 2.

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

不安装运行时运行.NET程序_服务器_11

 

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

export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
./SelfContainedTest
  • 1.
  • 2.

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

不安装运行时运行.NET程序_linux_12

总结

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

标签:文件,程序,linux,服务器,NET,安装,运行
From: https://www.cnblogs.com/cuihongyu3503319/p/18344878

相关文章

  • 更安全的alist手动安装挂载本机存储并使用nginx反代
    alist的手动安装挂载本机存储并使用nginx反代一、下载最新alist软件包wgethttps://github.com/alist-org/alist/releases/download/v3.36.0/alist-linux-amd64.tar.gz二、手动安装alist1.创建alist目录sudomkdir/opt/alist#创建运行alist的用户sudouseradd-r-s/us......
  • 五、.Net Core Web Api连接MongoDB自动创建表格并实现CRUD功能
    五、.NetCoreWebApi连接MongoDB自动创建表格并实现CRUD功能1.注册MongoDB账号,并获取ConnectionString;MongoDB官网:MongoDB:TheDeveloperDataPlatform|MongoDB获取ConnectionString教程:ConnectionString获取在VSCodeforMac按下shift+command+p搜索Nuget......
  • ubuntu22.04桌面版安装linux搜狗输入法
    本文参考搜狗输入法官方教程,并针对ubuntu22.04做了一些调整https://pinyin.sogou.com/linux/help.php1.安装fcitx#查看fcitx版本aptinfofcitx|grepVersionWARNING:aptdoesnothaveastableCLIinterface.Usewithcautioninscripts.Version:1:4.2.9.8-5#......
  • 面试题 .NET Core 开发工程师
    在面试.NETCore高级开发工程师时,通常会涉及多个方面的问题,以评估候选人在不同领域的深度和广度。以下是一些常见的面试题目分类及示例问题:###基础知识1.**.NETCore与.NETFramework的区别?**-请解释.NETCore和.NETFramework的主要区别,以及在什么情况下选择使用......
  • .NET 开源权限认证项目 MiniAuth上线
    前言在Web应用项目中权限认证是个绕不开的话题,传统方法复杂又耗时。MiniAuth推出专为.NET开发者设计的简单、实用的权限认证项目。MiniAuth,作为ASP.NETCore的插件,让我们快速轻松实现用户登录、权限检查等功能。它支持多种认证方式,如JWT、Cookie,且易于集成到现有项目中。无论是......
  • 安卓编译器gradle安装和idea配置gradle
    参考:gradle安装:https://www.cnblogs.com/darcy-hui/p/12206852.htmlgradleuserhome说明:https://blog.csdn.net/LG_15011399296/article/details/134333647gradle下载地址:https://gradle.org/releases/gradle阿里下载地址:https://mirrors.aliyun.com/gradle/gradle1.下载zip包,解......
  • ubuntu安装
    环境虚拟机:VMwaveWorkstation16.1.216.1.2是完美版,之后的版本,官方允许磁盘映射一次,再映射就报错了。VM17版本已经砍掉了虚拟磁盘映射功能。Linux:Ubuntu16.04虚拟机创建除特殊说明,其他默认直接下一步1.新建虚拟机-选择自定义配置2.选择稍后安装,先不加载镜......
  • laravel:从linux命令行运行command
    一,创建command1,执行命令liuhongdi@lhdpc:/data/api$phpartisanmake:commandIndexAllCommand2,查看创建的文件:<?phpnamespaceApp\Console\Commands;useIlluminate\Console\Command;classIndexAllCommandextendsCommand{/***Thenameandsignatu......
  • SQL2017 安装教程图解(详细到每一个细节)
    SQL2017安装教程图解(详细到每一个细节)----bayaim----2024年8月5日15:27:41----借鉴网址:https://blog.csdn.net/weixin_39665379/article/details/111100754 一、程序准备JDK:jdk-7u80-windows-x64(官网可以下最新的,JDK7以上就可以,其他版本没试过不知道可不可以,等我试过......
  • 剪映国际版(CapCut) 2024 下载 安装 汉化
    将 剪映国际版(CapCut)2024 压缩包解压到本地:点击蓝色字体下载压缩包提取码jwsg鼠标右键点击CapCut3.0.0.exe 选择 以管理员身份运行:勾选AgreewithCapCutUsersLicenseAgreement&PricacyPolicy点击More点击Browse...选择安装路径点击Installnow......