預編譯框架,開發高效能應用 - 課程 - 微軟技術暨生態大會 2018
微軟技術暨生態大會(Tech Summit),2018 年在上海世博中心召開。這是最後一次的 Tech Summit 了;明年開始,中國大陸地區就要和其他國家和地區一樣,進行全球 Ignite Tour 了。
我也有幸成為分會場講師團隊的一員,課程是《預編譯框架 - 開發高效能應用》。內容就是我部落格中與 MSBuild / Roslyn / dotnet / NuGet 相關的內容;我們將利用這些知識打造一個高效能客戶端應用。
進入 微軟技術暨生態大會 官網可以瞭解更多內容。如果你和我一樣對微軟技術富有熱情,那麼也歡迎你 買票 一起去上海。
關於課程《預編譯框架 - 開發高效能應用》
利用 Roslyn 在編譯期間提前完成收集和修改所需的各種資訊,我們能將 .NET 的反射耗時降低到近乎為 0!
當前大多數的框架都離不開反射的支援,但是 .NET 的反射很傷效能,而不用反射又很難支撐大型應用;基於 Roslyn 的預編譯框架旨在解決這些效能問題。
本次講題能學到什麼?
- 體驗預編譯框架的強大效能
- 理解 dotnet build 的編譯過程
- 使用 Roslyn 分析和修改專案原始碼
- 如何開發自己的預編譯框架
- 製作原始碼引用 NuGet 包(而不是 dll 引用 NuGet 包)
其實此課程的計劃課程內容有 2.5 小時,畢竟部落格都有好幾十篇了呢。算上跟我一起研究這項技術的
不過實際分會場課程中內容眾多,留給每個講師的時間只有 20 分鐘或者 45 分鐘。我有幸獲得了 45 分鐘時長的課程,所以雖然已經算長的了,卻也必須減少和壓縮課程內容。
於是,實際課程會以入門為主,進階內容將作為資料線下學習。注意:即便是“入門”,難度也依然是 300(難度範圍為 0-400),所以你必須擁有一定的 .NET 開發知識和一些應用開發經驗才會理解課程內容。如果你的經驗更偏客戶端應用開發,那麼更能體會本課程內容的目的。
課程大綱
課程大綱是為 2 小時的課程而設計的。所以實際上我只會講大部分內容,以下所有動手實驗和演示的地方都會略過,代之以提前執行和編寫的結果。
實際課程中會略過的部分以斜體表示。
- 引入
- 一批效能資料
- 收集:反射 VS 配置檔案 VS 預編譯
- 呼叫:直接呼叫 VS 最快反射 VS 預編譯
- 程式集個數:1 個 VS ……
- 一批效能資料
- 概覽
- 目錄
- 瞭解原始碼包 SourceYard 和預編譯框架 SourceFusion
- 學會編寫編譯期程式碼以提升應用效能
- 預編譯框架的原理
- 多個 API 的展示
- 原始碼包
- 編譯期類
- 類模板
- 擴充套件
- 目錄
- 教學
- 目標:學會使用編譯期程式碼代替反射以提升應用的執行效能
- 教學目錄
- 理解 dotnet build 的編譯過程
- 理解 csproj 檔案格式
- 理解編譯過程
- 理解 NuGet 打包原理
- 動手實驗:SourceYard 原始碼包簡化版
- 編譯期間執行一個 exe 程式
- 在 exe 程式中接收引數並干預編譯結果
- 學習使用 Roslyn 分析原始碼
- 語法視覺化窗格
- 分析 C# 語法樹
- 在編譯期間執行程式碼
- 動手實驗:SourceFusion 預編譯框架簡化版
- 在編譯期間收集程式集中具有特定標記的所有型別
- 生成程式碼以快速訪問這些型別的特定方法
- 理解 dotnet build 的編譯過程
- 回顧
- 回顧 dotnet build 的編譯過程和 Roslyn 分析原始碼
- SourceYard 和 SourceFusion 的開源倉庫,歡迎加入
關於講師 —— 呂毅
你可以進入 微軟技術暨生態大會 - 大會日程 頁面,然後點選 “演講嘉賓”。
在這裡,你可以看到主題演講、分會場課程以及動手實驗室的各位講師,可以去了解每一位講師以及他們的課程。當然,你也可以看到我。
歡迎你的加入
最後,歡迎你一起參加微軟技術暨生態大會,我們一起去與微軟大咖,各位微軟 MVP,社群技術牛人交流技術。
課程課件使用 希沃白板 5 製作,這是一款專門針對教學場景設計的互動課件工具。
相關連結
SourceYard 原始碼包
SourceFusion 預編譯框架
- 理解 C# 專案 csproj 檔案格式的本質和編譯流程 - 呂毅
- 將 WPF、UWP 以及其他各種型別的舊 csproj 遷移成基於 Microsoft.NET.Sdk 的新 csproj - 呂毅
- 新 csproj 對 WPF/UWP 支援不太好?有第三方 SDK 可以用!MSBuild.Sdk.Extras - 呂毅
- 如何使用 MSBuild Target(Exec)中的控制檯輸出 - 呂毅
- 如何在 MSBuild Target(Exec)中報告編譯錯誤和編譯警告 - 呂毅
- 在製作跨平臺的 NuGet 工具包時,如何將工具(exe/dll)的所有依賴一併放入包中 - 呂毅
- 如何編寫基於 Microsoft.NET.Sdk 的跨平臺的 MSBuild Target(附各種自帶的 Task) - 呂毅
- Roslyn 如何使用 MSBuild Copy 複製檔案 - 林德熙
- 每次都要重新編譯?太慢!讓跨平臺的 MSBuild/dotnet build 的 Target 支援差量編譯 - 呂毅
- 解讀 Microsoft.NET.Sdk 的原始碼,你能定製各種奇怪而富有創意的編譯過程 - 呂毅
- 幫助官方 NuGet 解掉 Bug,製作絕對不會傳遞依賴的 NuGet 包 - 呂毅
- 專案檔案中的已知屬性(知道了這些,就不會隨便在 csproj 中寫死常量啦) - 呂毅
- 專案檔案中的已知 NuGet 屬性(使用這些屬性,建立 NuGet 包就可以不需要 nuspec 檔案啦) - 呂毅
- 如何建立一個基於 MSBuild Task 的跨平臺的 NuGet 工具包 - 呂毅
- 如何建立一個基於命令列工具的跨平臺的 NuGet 工具包 - 呂毅
- Roslyn 通過 Target 修改編譯的檔案 - 林德熙
- Roslyn 使用 WriteLinesToFile 解決引數過長無法傳入 - 林德熙
- Roslyn 如何在 Target 引用 xaml 防止檔案沒有編譯 - 林德熙
- Roslyn 通過 nuget 統一管理資訊 - 林德熙
- Roslyn 使用 Target 替換佔位符方式生成 nuget 打包 - 林德熙
- MSBuild/Roslyn 和 NuGet 的 100 個坑 - 呂毅
- Roslyn 通過 Nuget 引用原始碼 在 VS 智慧提示正常但是無法編譯 - 林德熙
- 都是用 DllImport?有沒有考慮過自己寫一個 extern 方法? - 呂毅
- .NET/C# 中你可以在程式碼中寫多個 Main 函式,然後按需要隨時切換 - 呂毅
- Roslyn 入門:使用 Visual Studio 的語法視覺化(Syntax Visualizer)窗格檢視和了解程式碼的語法樹 - 呂毅
- Roslyn 靜態分析 - 林德熙
- Roslyn 入門:使用 Roslyn 靜態分析現有專案中的程式碼 - 呂毅
- Roslyn 入門:使用 .NET Core 版本的 Roslyn 編譯並執行跨平臺的靜態的原始碼 - 呂毅
- Roslyn 語法樹中的各種語法節點及每個節點的含義 - 呂毅
- Roslyn 通過 Nuget 管理公司配置 - 林德熙
- Roslyn 在專案檔案使用條件判斷 - 林德熙
更多 MSBuild / Roslyn / dotnet / NuGet 相關的知識
- 理解 Roslyn 中的紅綠樹(Red-Green Trees) - 呂毅
- Roslyn 的確定性構建 - 呂毅
- Roslyn 節點的 Span 和 FullSpan 有什麼區別 - 林德熙
- Roslyn NameSyntax 的 ToString 和 ToFullString 的區別 - 林德熙
- 自動將 NuGet 包的引用方式從 packages.config 升級為 PackageReference - 呂毅
- 如何最快速地將舊的 NuGet 包 (2.x, packages.config) 升級成新的 NuGet 包 (4.x, PackageReference) - 呂毅
- 阻止某個 NuGet 包意外升級 - 呂毅
- 語義版本號(Semantic Versioning) - 呂毅
- 使用 MSBuild 響應檔案 (rsp) 來指定 dotnet build 命令列編譯時的大量引數 - 呂毅
- Roslyn 使用 Directory.Build.props 管理多個專案配置 - 林德熙
- Roslyn 使用 Directory.Build.props 檔案定義編譯 - 林德熙
- 在 Visual Studio 的解決方案資源管理器中隱藏一些檔案 - 呂毅
- 使用連結共享 Visual Studio 中的程式碼檔案 - 呂毅
- 為 Visual Studio 使用萬用字元批量新增專案檔案 - 呂毅
- (1/2) 為了理解 UWP 的啟動流程,我從零開始建立了一個 UWP 程式 - 呂毅
- dotnet core 通過修改檔案頭的方式隱藏控制檯視窗 - 林德熙
- 使用 GitVersion 在編譯或持續構建時自動使用語義版本號(Semantic Versioning) - 呂毅
- Automatically increase the semantic version using GitVersion - 呂毅
- Reading the Source Code of Microsoft.NET.Sdk, Writing the Creative Extension of Compiling - 呂毅