厚積薄發,擁抱 .NET 2016

来源:http://www.cnblogs.com/OceanEyes/archive/2016/06/12/dotnet_2016_overview.html
-Advertisement-
Play Games

厚積薄發 這個詞是高三英語老師在高考前寫在黑板上,高中三年努力這麼久,是時候迎面而上,衝刺向前。所以,一想到.NET 2016,腦海裡蹦出的第一個詞就是它。 .NET 2016 是 .NET 一次質的飛躍,不管難易,我們需要擁抱變化。 初識 .NET 2016 .NET 2016 概覽 .NET 2 ...


厚積薄發這個詞是高三英語老師在高考前寫在黑板上,高中三年努力這麼久,是時候迎面而上,衝刺向前。所以,一想到.NET 2016,腦海裡蹦出的第一個詞就是它。 .NET 2016 是 .NET 一次質的飛躍,不管難易,我們需要擁抱變化。

初識 .NET 2016

  • .NET 2016 概覽

.NET 2016 作為 .NET 技術最新發展,如下圖所示,它主要包含三大塊:

最左邊代表的是 .NET Framework 4.6,WPF、ASP.NET 4.x、ASP.NET Core 1.0 能運行在它上。中間這部分代表的是 .NET Core 技術,ASP.NET Core 1.0 和 Universal Windows Platform(UWP)能運行在它之上。當然,你也可以創建控制台應用程式運行在.NET Core 上。最右邊是 Xamarin,它是一個基於 Mono 的跨平臺移動開發框架。

在.NET 2015 時,微軟為我們帶來了全新的 .NET,它就是.NET Core。.NET Core 的一個重要組成部分是新的運行時(Runtime):CoreCLR。除了使用 CoreCLR 運行時外,.NET 也能被編譯成 Native Code。UWP 自動使用這個特性,應用程式在提交到 Windows Store 後被編譯成 Native Code,最終生成優化過後的代碼,可以讓 APP 啟動時間加快並可以減少記憶體消耗 。你當然也能編譯其他.NET Core 應用程式成 Native Code,併在Linux運行。

在上圖的底部,你可以看到有一些東西在.NET Framework 4.6、.NET Core、Xamarin 之間共用。比如一些共用的Libraries,通過 Nuget 包的概念將這些 Libraries 彙集在 Package 中供所有的.NET 平臺使用。還有一些運行時組件(Runtime Components)被共用,如 GC 和 RyuJIT,這是一個新的JIT編譯器,這個新的 JIT 編譯器不僅比以前更快,在調試時它還具有更好的支持編輯和繼續功能。這個功能可以在調試時編輯代碼並繼續調試,而不需要停止和重新啟動進程。CLR、CoreCLR、.NET Native 使用 GC 進行實例的銷毀以及記憶體的回收,並且 CLR 和 CoreCLR 使用 RyuJIT 編譯器將 IL 代碼編譯成 Native Code 。當然,新的編譯器 Roslyn 也是共用的。

  • .NET Framework 4.6

.NET Framework 4.6 作為 .NET Framework 的最新版本,在過去 10 多年間,不斷被增強。我們利用這個 Framework 構建 Windows Form 、WPF、ASP.NET 4 等應用程式。儘管 ASP.NET Core 應用程式運行在.NET Core 上,但它也能運行在.NET Framework 4.6 上。

如果你想要繼續使用 ASP.NET Web Form 開發應用程式,.那麼 NET Framework 4.6 中的 ASP.NET 4.6 是你的最佳選擇。值得註意的是你不能在.NET Core 上運行 ASP.NET Web Form 應用程式。

  • .NET Core 1.0

.NET Core 1.0(目前是 RC2),是新的.NET,相比於 Mono,它是真正意義上跨平臺的實現。.NET Core 被設計成模塊化的方法,即被分割成大量的 Nuget Package。在應用程式中,你決定需要哪些 Package,並且隨時保持更新和卸載。而.NET Framework,它是操作系統的一部分,註定不能實時被更新,同時,過去 10 多年件,.NET Framework 加入非常多的新功能,它變得越來越大,更糟糕的是,它不可能移除不再需要的舊功能。比如舊的集合類不再被使用因為泛型集合類加入,.NET Remoting 被新的通信技術 WCF、ASP.NET Web API 替換,LINQ to Sql 被 EntityFramework 替換。而這些舊技術,一直存在.NET Framework 中,你不得不全盤接受他們。

  • Xamarin

Mono 是開源社區開發的跨平臺.NET Framework,而 Xamarin 是一個構建於 Mono 上跨平臺移動應用開發框架。相信微軟收購了 Xamarin 之後,Mono 將得到大力支持,.NET Core 在移動端的表現拭目以待。

使用 .NET Framework 4.6 編譯應用程式

創建 “Hello World” 應用程式是學習一門新技術的開篇。在這兒,為了更好的去理解.NET Core,我們不打算去使用Visual Studio 2015 進行開發。

  • Developer Command Prompt 編譯代碼

當安裝完畢 Visual Studio 後,我們可以通過配套工具 Developer Command Prompt 使用 C# 編譯器編譯代碼。

1.打開記事本,使用 C# 編寫如下代碼,命名為 HelloWorldApp.cs 並保存至 C:\Code 文件夾

class Program { static void Main() { System.Console.WriteLine("Hello World");}}

2.啟動 Developer Command Prompt for VS2015,鍵入如下命令:

  • 進入 C:\Code 文件夾 cd C:\Code
  • 使用 C# 編譯器編譯源代碼 csc HelloWorldApp.cs
  • 查看文件目錄結構 dir
  • 輸入EXE 名來運行應用程式 HelloWorldApp

運行結果如下所示:

註意你的源代碼文件 HelloWorldApp.cs,已經編譯到程式集HelloWorldApp.exe 中。當你輸入 HelloWorldApp 名來運行應用程式,最終被.NET Framework 4.6 和它的 CLR 載入並運行。

  • 使用 ILDASM 反編譯程式集

1.C# 編譯器將源代碼轉換成IL代碼後存儲到程式集中(DLL 或者 EXE)。

2.IL 代碼語句就像彙編語言指令,它們被.NET 的虛擬機也就是 CLR執行。在運行時,CLR 從程式集中載入 IL 代碼,然後 JIT 編譯器編譯成 Native Code,最後交由 CPU執行。

在 Developer Command Prompt 輸入 ildasm HelloWorldApp.exe,你會看到ILDASM 工具載入編譯過後的程式集:

雙擊 MANIFEST 節點,查看元數據:

可以看到.NET Metadata 的版本是 4.0.30319,並且依賴外部的程式集mscorlib,它的版本是4.0.0.0,上述截圖告訴我們,要運行這個應用程式需要安裝.NET Framework 4.0以上。

關閉 MANIFEST 視窗,再展開 Program 節點,雙擊 Main 方法:

註意IL 指令:ldstr(load string ),nop(no operation ),call,ret(return)。記住IL 最終被 CLR 執行。

使用 .NET Core CLI 編譯應用程式

要使用最新的.NET Core Command Line(CLI),請確保全裝了.NET Core 和 CLI Tools。你可以訪問 https://dotnet.github.io/ 來為 Windows、Linux、OS X 安裝它們。

成功安裝.NET Core CLI Tools 之後,可以在 Developer Command Prompt 鍵入 dotnet help 來 查看具體使用:

  • 使用 CLI 創建.NET Core 應用程式

你需要通過 Developer Command Prompt 使用如下命令:

1.再次進入 C:\Code 文件夾 cd c:\code
2.創建新文件夾 mkdir SecondApp
3.進入新文件夾 cd SecondApp
4.使用 CLI 創建.NET Core應用程式 dotnet new
5.查看目錄結構 dir

dotnet new 命令創建了一個新的.NET Core 應用程式,包含兩個文件,分別是 Program.cs 和 project.json。

Program.cs 是個簡單的控制台應用程式,輸出“Hello World”

using System;
namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

而另一個文件:project.json,它是項目配置文件,並以JSON的格式定義了應用程式的基本信息,比如:version、buildOptions、authors、dependencies、frameworks 等。

{
    "version": "1.0.0-*",
    "buildOptions": {
        "emitEntryPoint": true
    },
    "dependencies": {
    "Microsoft.NETCore.App": {
      "type": "platform",
      "version": "1.0.0-rc2-3002702"
    }
  },
  "frameworks": {
    "netcoreapp1.0": {
      "imports": "dnxcore50"
    }
  }
}

上述JSON 格式中,由於 Main 方法作為應用程式的入口(Entry Point),所以需要將 buildOptions 節點下的emitEntryPoint 屬性設置為 true。

dependencies 節點代表應用依賴的 packages,預設情況下只添加了 Microsoft.NETCore.App 的依賴。值得註意的是,Microsoft.NETCore.App 是一個引用類型的Nuget Package,它又引用了其他的Nuget Package。這樣的好處是避免添加大量的其他package。

framewors 節點列出了應用程式支持的 frameworks。預設情況下,應用程式只支持.NET Core 1.0,以別名 netcoreapp1.0 表示。netcoreapp1.0 下的 imports 節點 引用舊名稱 dnxcore50。這允許我們仍舊可以使用舊名稱的 package。

最後,通過dotnet restore 下載所需要的依賴項

通過 project.lock.json,查看具體下載的 package 版本。

為了編譯應用程式,使用命令 dotnet build

最後,使用 dotnet run 運行應用程式。

值得註意的是,在 framework 中也可以添加應用程式對其他 frameworks 的支持,添加字元串net46,表示當前的控制台應用程式構建於.NET Framework 4.6之上:

"frameworks": {
    "netcoreapp1.0": {
        "imports": "dnxcore50"
    },
    "net46":{}
}

遺憾的是,dotnet build 之後,發生了異常。如下所示(註:當前版本是.NET Core RC 2),

可以看到異常信息是 System.Runtime.Loader 不支持.NET Framework 4.6。只是一個很籠統的信息,個人猜測 Runtime Loader 只支持 CoreCLR 的載入,在 Github(https://github.com/dotnet/corefx/issues/8453) 中,也應證了我的觀點。暫時的解決方法是將dependencies 節點 移入到frameworks 下的 netcoreapp1.0 中:

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true
  },
  "frameworks": {
    "netcoreapp1.0": {
      "imports": "dnxcore50",
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.0.0-rc2-3002702"
        }
      }
    },
    "net46":{}
  }
}

dotnet build 之後,分別生成兩個文件夾 net46 和 netcoreapp1.0,使用 ILDasm(見上一小節)工具,打開文件夾可以看到他們之間一個很重要的區別,使用.NET Framework 的應用程式編譯之後為生成包含 IL 的 EXE 應用程式並且依賴mscorlib程式集 ,而使用.NET Core 的應用程式編譯之後生成包含 IL 的DLL,依賴System.Console 和 System.Runtime 程式集。

最後,通過 dotnet run --framework net46 指定 famework 的版本為.NET Framework 4.6 查看運行結果。

最後,通過 CLI 你可以 打包(dotnet pack)和 發佈(dotnet publish)應用程式。

dotnet pack 創建了一個 NuGet Package:

它是一個尾碼名為 nupkg 的 Nuget Package,你可以將它改為.zip,解壓查看裡面的內容。

dotnet publish

發佈一個可用於部署.NET 項目(包括runtime)。

小結

告別.NET 開發一年多,沒想到發生了這麼多不可思議的技術,抓緊時間補充一下。我招過人,也求過職,深切體會到國內.NET 的生態環境不給力,希望.NET Core 的出現能為我們指向一條明路,就像森林里一縷陽光,帶來希望。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Let's Encrypt是一個免費SSL證書發行項目,發行的證書已經獲得主流瀏覽器的支持,親測谷歌瀏覽器(桌面版)、火狐瀏覽器(桌面版)、UC瀏覽器(手機版)、360瀏覽器(手機版)支持,其它的暫沒測試; 本文講解如何使用Let's Encrypt獲得免費SSL證書,配置apache的SSL功能, ...
  • 源內容:http://www.cnblogs.com/shouce/p/5558095.html#undefined 下麵的內容是根據“源內容”進行了整改、補充。 三種方式實例化一類,包括無參數構造形式與有參數構造形式性能測試。 測試環境: 1) Visual studio 2015 Communi ...
  • 先收藏,後看;千萬不要做一個屯書的人,一定要堅持有選擇性的看下去; 資料庫類 資料庫類 SqlServer Oracle .NET 更多... .NET 更多... Web 更多... Web 更多... 架構 架構 不颳了,直接可以看到了。 鏈接: http://pan.baidu.com/s/1 ...
  • 近期都在處理淘寶商品數據包識別問題,滿以為CSV文件就是以行為分割,以逗號為欄位分割的文件體系。 自己在編寫處理程式時,增加了2個參數: 第一個,字元集,第二,告知處理方法,文件的列在第幾行。 同時,對某些生成出來的數據包不規據的,例如生成出2個同名列的,等等文件,做了一定的容錯。 滿以為這樣就OK ...
  • 前言 在前一篇文章中我已經做過開篇,接下來的隨筆會詳細講一下我們的開發框架是如何實現的,專業的事由專業的人來講,以後就由我們的高級碼農小李英文名查爾斯和他的師父廠長(因為姓陳,酷愛攝影,我們的文藝片都是從他那裡來的,所以叫廠長) 技術選型 “查爾斯,這個敏捷開發框架我們要開始做了,給你分點任務,你要 ...
  • 這篇教程將告訴你如何使用 Visual Studio 2015 構建一個 ASP.NET Core MVC Web 應用程式的基礎知識。 ...
  • OO思想現在已經在軟體開發項目中廣泛應用,其中最重要的一個特性就是繼承,最近偶簡單的複習了下在C#中涉及到繼承這個特性時,所需要用到的關鍵字,其中有一些關鍵點,特地整理出來,方便大家查閱。 一、在C#中,new這個關鍵字使用頻率非常高,主要有3個功能: a) 作為運算符用來創建一個對象和調用構造函數 ...
  • 本次知識點:Linux系統的多終端切換,linux下的用戶,linux遠程訪問工具使用,linux下重要的目錄,命令的組成,通配符,linux的路徑問題,文件操作的綜合運用 為什麼學習linux? 1.很多人都說.net程式員只會在Windows的環境下進行工作,壓根就不懂Linux的使用,也不懂L ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...