微軟技術暨生態大會(Tech Summit),2018 年在上海世博中心召開。這是最後一次的 Tech Summit 了;明年開始,中國大陸地區就要和其他國家和地區一樣,進行全球 Ignite Tour 了。
我也有幸成爲分會場講師團隊的一員,課程是《預編譯框架 - 開發高性能應用》。內容就是我博客中與 MSBuild / Roslyn / dotnet / NuGet 相關的內容;我們將利用這些知識打造一個高性能客戶端應用。
進入 微軟技術暨生態大會 官網可以瞭解更多內容。如果你和我一樣對微軟技術富有熱情,那麼也歡迎你 買票 一起去上海。
關於課程《預編譯框架 - 開發高性能應用》
利用 Roslyn 在編譯期間提前完成收集和修改所需的各種信息,我們能將 .NET 的反射耗時降低到近乎爲 0!
當前大多數的框架都離不開反射的支持,但是 .NET 的反射很傷性能,而不用反射又很難支撐大型應用;基於 Roslyn 的預編譯框架旨在解決這些性能問題。
本次講題能學到什麼?
- 體驗預編譯框架的強大性能
- 理解 dotnet build 的編譯過程
- 使用 Roslyn 分析和修改項目源代碼
- 如何開發自己的預編譯框架
- 製作源代碼引用 NuGet 包(而不是 dll 引用 NuGet 包)
其實此課程的計劃課程內容有 2.5 小時,畢竟博客都有好幾十篇了呢。算上跟我一起研究這項技術的 林德熙的與 Roslyn 相關的博客,那就更多了,而且還在持續增加中。
不過實際分會場課程中內容衆多,留給每個講師的時間只有 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 - 呂毅