不安裝運行時運行 .NET 程序

好久沒寫文章了,有些同學問我公眾號是不是廢了?其實并沒有。其實想寫的東西很多很多,主要是最近公司比較忙,以及一些其他個人原因沒有時間來更新文章。這幾天抽空寫了一點點東西,證明公眾號還活著。
長久以來的認知,對于托管代碼 .NET / JAVA ,都是需要在服務器上安裝 SDK 或者運行時的。比如 .NET Framework 4.XX ,JDK/JRE.XX 等。其實從 .NET Core 2.1 開始我們的 .NET 程序可以獨立打包成可以執行文件,在服務器上根本不需要安裝任何運行時相關的東西就可以運行。這個發布模式在某些情況下可以大大提高部署的效率。以下簡單介紹一下。

“獨立”部署模式

在發布界面部署模式選擇“獨立”,點擊保存之后然后正常發布。等到發布完成之后,查看 publish 目錄,可以發現里面生成了一大堆文件,數量有上百個。這里其實就包含了 runtime 相關的文件。
f9c69294dbd387fe8f589ad1ed5ae262.png
我們把這堆文件全部復制到某個未安裝過 .NET SDK 或者 runtime 的 windows 服務器上,找到 SelfContainedTest.exe 文件,雙擊運行。如果一切順利,會啟動一個控制臺。
1727b91a1a56f4145f6d3f2e6833d0de.png

be16e5525295d55204633c662f3938a8.png
訪問一下服務器的 5000 口,看到測試數據被成功的輸出了,證明我們的 .NET 程序可以正常運行了 。
819e2ddbac0444a9a403b58cb127ed21.png

單文件

上面的操作我們已經可以不安裝運行時在服務器上運行 .NET 程序了。但是那么多文件看著不太優雅,下面讓我們的 .NET 程序打包成一個文件。
打開發布設置界面,勾上“生成單個文件”
9bc341cd120e980ecf41d4ce4e4aab2c.png
點擊保存,發布之后,在 publish 目錄可以看到只剩下 6 個文件了。排除配置文件,pdb 文件等,其實真正的程序只是 SelfContainedTest.exe 文件,所以稱之為單文件。雙擊這個文件我們的程序就可以正常的運行了。
18ae955bc60996308cbc0436b280be99.png

裁剪

以上我們已經把程序從多個文件打包成一個文件了。這個文件我們可以看到有 70 M ,對于我們一個簡單的演示程序來說 70M 也挺大了。那么有什么辦法來縮小我們的可以執行文件嗎?
其實我們只要在發布配置上打開裁剪功能,就可以縮小我們的程序。
1c6bd3d84b49c4dee8542d3167edf5ce.png
在發布配置界面勾上“裁剪未使用的代碼”,點擊保存,發布之后,在 publish 文件夾下面生成的 SelfContainedTest.exe 文件縮小到了 30M 左右。
87cd8d7610a454f1717ffa151ac6b16c.png

裁剪的注意點

這里大概說一下裁剪的原理。當我們使用裁剪功能的時候,發布程序會開始分析我們的代碼,哪些類被使用,哪些類沒有使用,沒有使用的類就會被刪除掉,使用這樣的原理來減小發布后程序集的大小。
但是以上方法顯然會有一個問題,那就是無法識別動態性很強的代碼,比如反射實現的某些功能。比如以下代碼:

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

顯然以上代碼靜態分析沒辦法知道程序最終需要使用那些類,因為目標類是通過 Console.ReadLine 方法輸入進去的。在程序沒有執行的時候誰也不知道哪些類會被使用。

在 IIS 上運行

上面我們演示程序運行的時候是寄宿在控制臺上的,這樣的話很容易被人誤關閉。其實單文件發布的程序照樣可以使用 IIS 來托管。
按照正常的 IIS 發布網站的流程配置之后,把應用程序池設置為 “無托管代碼” 訪問對應的端口程序就可以正常運行了。

ba37f6f96776a9d5d6acb8e779eb7a8b.png

在 linux 上運行

以上我們都是在 windows 上測試,現在讓我們試一下在 linux 上運行它。
在 linux 上運行的話,需要在發布配置界面修改“目標運行時”為 linux-64 。
f6f418b9d5d5c22523a361fcda8e7310.png發布成功后把生成的文件復制到 linux 服務器上。cd 到目錄,運行以下代碼。

chmod?+x?SelfContainedTest
./SelfContainedTest

很不幸,我們的程序沒有按計劃運行起來。
89e4c3ff9e53e4a6b93dc1051662155d.png
通過搜索后發現,需要設置一個環境變量。修改運行的代碼:

export?DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
./SelfContainedTest

運行完之后我們的程序應該會順利的啟動。訪問一下對應的 http 接口,可以看到正確的輸出了。

a2f4635a935b839e6287422dbd0b92b4.png

總結

通過以上演示,我們根本沒必要在服務器(windows/linux)上安裝任何 SDK 或者運行時就可以完整的運行我們的 .NET 程序。而且通過裁剪之后我們的程序的大小也縮小到了一個很小的范圍。以上功能對于互聯網行業來說可能沒什么必要,畢竟大家走的都是容器化部署,服務器上本來就不需要安裝運行時。但是對于一些傳統行業,比如醫院這樣的環境,還有很多需要在服務器上人肉部署的場景。在這些場景之下就非常有意義了,可以大大的體高部署的效率。畢竟不是誰都可以很快的在服務器上安裝好運行時,特別是 linux 服務器。
其實不安裝運行時來運行程序還有一個辦法,那就是使用 AOT 發布,這個我們下次再講。

關注我的公眾號一起玩轉技術

be65873426fbb6f5ebaf50a9df4c0299.jpeg

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284021.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284021.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284021.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一文弄懂分布式和微服務

簡單的說,微服務是架構設計方式,分布式是系統部署方式,兩者概念不同。 微服務 簡單來說微服務就是很小的服務,小到一個服務只對應一個單一的功能,只做一件事。這個服務可以單獨部署運行,服務之間可以通過R…

常見的js算法面試題收集,es6實現

1、js 統計一個字符串出現頻率最高的字母/數字 let str asdfghjklaqwertyuiopiaia; const strChar str > {let string [...str],maxValue ,obj {},max 0;string.forEach(value > {obj[value] obj[value] undefined ? 1 : obj[value] 1if (obj[value] > max)…

PHP面向對象(OOP)----分頁類

PHP面向對象(OOP)----分頁類 同驗證碼類,分頁也是在個人博客,論壇等網站中不可缺少的方式,通過分頁可以在一個界面展示固定條數的數據,而不至于將所有數據全部羅列到一起,實現分頁的原理其實就是對數據庫查詢輸出加了一…

JS 事件練習

QQ拖拽及狀態欄選擇 HTML 1 <!DOCTYPE html>2 <html xmlns"http://www.w3.org/1999/xhtml">3 <head>4 <title>QQ練習</title>5 <link href"css/main.css" rel"stylesheet" />6 <script src&…

Dubbo和Spring Cloud微服務架構對比

微服務架構是互聯網很熱門的話題&#xff0c;是互聯網技術發展的必然結果。它提倡將單一應用程序劃分成一組小的服務&#xff0c;服務之間互相協調、互相配合&#xff0c;為用戶提供最終價值。目錄 微服務主要的優勢 降低復雜度 可獨立部署 容錯 擴展 核心部件 總體架構 Dubbo …

《ABP Framework 極速開發》 - 教程首發

?寫在發布之前強烈建議每一位小伙伴都應該好好看看 ABP Framework 官方文檔&#xff0c;可能有很多的小伙伴跟我剛開始的感覺一樣“一看文檔深似海”&#xff0c;看完文檔之后&#xff0c;想要上手卻找不著頭緒。本套教程寫作的目的之一是為初學者提供一條相對簡潔的快速上手路…

智能家居系統結構標準化

版權申明&#xff1a;本文為博主窗戶(Colin Cai)原創&#xff0c;歡迎轉帖。如要轉貼&#xff0c;必須注明原文網址http://www.cnblogs.com/Colin-Cai/p/8490423.html作者&#xff1a;窗戶QQ&#xff1a;6679072E-mail&#xff1a;6679072qq.com0 引 言 智能家居是指利用先進的…

洛谷 P3391 文藝平衡樹

題目描述 您需要寫一種數據結構&#xff08;可參考題目標題&#xff09;&#xff0c;來維護一個有序數列&#xff0c;其中需要提供以下操作&#xff1a;翻轉一個區間&#xff0c;例如原有序序列是5 4 3 2 1&#xff0c;翻轉區間是[2,4]的話&#xff0c;結果是5 2 3 4 1 --by洛谷…

JSONObject中optString和getString等的區別

2019獨角獸企業重金招聘Python工程師標準>>> 同事在看到我寫的解析數據代碼后&#xff0c;告訴我optString比getString好用&#xff0c;optString不會拋異常&#xff0c;而getString會拋異常&#xff0c;自己是將信將疑&#xff0c;就說&#xff0c;回去后我查查資料…

Lombok插件安裝(IDEA)、配置jar包、使用

點擊進入Lombok官網下載Lombok jar包 使用Lombok可能需要注意的地方 &#xff08;1&#xff09;當你的IDE是Idea時&#xff0c;要注意你的Idea是支持Lombok的&#xff0c;如果不支持請更換高版本嘗試&#xff08;這里采用2018 3.3&#xff09;。 &#xff08;2&#xff09;在使…

Blazor University (40)JavaScript 互操作 —— 傳遞 HTML 元素引用

原文鏈接&#xff1a;https://blazor-university.com/javascript-interop/calling-javascript-from-dotnet/passing-html-element-references/傳遞 HTML 元素引用源代碼[1]在編寫 Blazor 應用程序時&#xff0c;不鼓勵對文檔對象模型 (DOM) 進行操作&#xff0c;因為它可能會干…

RabbitMQ+PHP 教程六(RPC)

(using php-amqplib) 前提必讀 本教程假設RabbitMQ是安裝在標準端口上運行&#xff08;5672&#xff09;。如果您使用不同的主機、端口或憑據&#xff0c;則連接設置需要調整。 如果您在本教程中遇到困難&#xff0c;可以通過郵件列表與我們聯系。 開始 在第二個教程中&#xf…

TKMybatis 介紹和使用

目錄 一、什么是 TKMybatis 二、TKMybatis 使用 2.1 Springboot 項目中加入依賴 2.2 使用講解 2.2.1 實體類中使用 2.2.2 dao中使用 2.2.3 Service 層中使用 2.3 實際案例 2.3.1 dao 層使用 2.3.2 service 層使用 一、什么是 TKMybatis TKMybatis 是基于 Mybatis 框…

angularjs的ng-repeat回調

首先html代碼是這樣的&#xff1a; <label>Name des Leiters:</label><select name"leaderID" id"selectLeaderID"><option ng-repeat"manager in managers" value"leader_id{{manager.id}}&leader_name{{manager…

sed和vim練習

1、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符sed s^[[:space:]]\ /etc/grub2.conf2、刪除/etc/fstab文件中所有以#開頭&#xff0c;后面至少跟一個空白字符的行的行首的#和空白字符sed -n s^#[[:space:]]\p /etc/fstab3、在/root/install.log每一行行首增加#…

WinForm(三)揭開可視化控件的面紗

WinForm所見即所得的UI設計框架&#xff0c;開發效率確實有所提升&#xff0c;同時降低了編程門檻&#xff0c;讓WinForm更普及。拖拖拽拽就能設計出一個界面&#xff0c;那么我們拖拽的這些東西是什么&#xff1f;它們是什么原理&#xff1f;。WinForm我覺得很好的一點是&…

淺談 maxMemory , totalMemory , freeMemory 和 OOM 與 native Heap

作者&#xff1a;林冠宏 / 指尖下的幽靈 掘金&#xff1a;https://juejin.im/user/587f0dfe128fe100570ce2d8 博客&#xff1a;http://www.cnblogs.com/linguanh/ GitHub &#xff1a; https://github.com/af913337456/ 騰訊云專欄&#xff1a; https://cloud.tencent.com/deve…

RestTemplate 詳解

在項目中&#xff0c;當我們需要遠程調用一個 HTTP 接口時&#xff0c;我們經常會用到 RestTemplate 這個類。這個類是 Spring 框架提供的一個工具類。Spring 官網對它的介紹如下&#xff1a; RestTemplate: The original Spring REST client with a synchronous, template met…

初識Spark2.0之Spark SQL

內存計算平臺Spark在今年6月份的時候正式發布了spark2.0&#xff0c;相比上一版本的spark1.6版本&#xff0c;在內存優化&#xff0c;數據組織&#xff0c;流計算等方面都做出了較大的改變&#xff0c;同時更加注重基于DataFrame數據組織的MLlib&#xff0c;更加注重機器學習整…

webpack開發Vue配置

一直以來使用webpack都是用的別人的配置&#xff0c;這幾天自己學習了一下。 項目地址&#xff1a;https://github.com/donghaohao... 新建整個工程 npm init安裝依賴&#xff0c;這里我們開發vue項目&#xff0c;npm install vue --save&#xff0c;然后是開發時的依賴npm ins…