從零開始學(xué)習(xí) dotnet 編譯過程和 Roslyn 源碼分析

本文為轉(zhuǎn)載:【 呂毅 https://walterlv.com](https://walterlv.com/

本文整理我和 林德熙 學(xué)習(xí)的 dotnet 編譯知識、Roslyn 源碼分析知識,NuGet 知識。通過閱讀本文可以從零散的碎片化博客中得到從零開始學(xué)習(xí)的軌跡。

本文服務(wù)于 微軟技術(shù)暨生態(tài)大會 2018 課程,你可以學(xué)習(xí)預(yù)編譯框架相關(guān)的技術(shù)原理。


SourceYard 性能數(shù)據(jù)

SourceYard 通過將公共組件的源代碼和產(chǎn)品源代碼合并來提升性能。

以下是這部分的性能數(shù)據(jù):

不過,程序集中的類的數(shù)量對啟動性能沒有影響:

SourceFusion 性能數(shù)據(jù)

SourceFusion 的其中一個用途是收集原本會通過反射收集的類型信息。

以下是這部分的性能數(shù)據(jù):

額外的,如果不是收集而單單只是使用的話,這里是性能數(shù)據(jù):

dotnet build 基礎(chǔ)

你需要先了解 csproj 文件的結(jié)構(gòu),以便進(jìn)行后續(xù)的學(xué)習(xí):

在了解到 csproj 文件結(jié)構(gòu)之后,你可以通過遷移一些項目,并確保他們編譯通過來練習(xí):

接著,csproj 中的重要內(nèi)容 Target 對理解編譯過程非常重要,因為它決定了如何編譯這個項目:

更高級的 Target 用法:

基于 Target 的一些應(yīng)用:

當(dāng)現(xiàn)有的知識和文檔不足以幫助你完成現(xiàn)有功能的時候,也許你該考慮閱讀官方源碼了:

還有一些 csproj 特性的使用:

NuGet 基礎(chǔ)

可以使用 NuGet 做一些不是傳統(tǒng) dll 引用的功能:

現(xiàn)在,我們需要真的使用 NuGet 做一個自己的工具了:

NuGet 的坑很多,有些可以解,有些需要規(guī)避:

如果你的 NuGet 格式是舊的,或者說引用方式是舊的,推薦升級:

學(xué)會這些 NuGet 技能之后的一些應(yīng)用:

SourceYard 原理

SourceYard 利用 NuGet 自動 Import 的 Target 來執(zhí)行我們的代碼:

Roslyn 基礎(chǔ)

Roslyn 由于其豐富且易用的 API,所以入門是比較容易的。推薦的入門文章有:

額外的,你可以閱讀更多 Roslyn 的資料以便快速應(yīng)用于你的項目:

Roslyn 為何能夠在提供如此友好的 API 的情況下依然有如此高的性能?

一些 Roslyn 的額外功能:

SourceFusion 預(yù)編譯框架

關(guān)于預(yù)編譯框架的博客沒有那么多,只有一些基本的使用:

擴(kuò)展閱讀

這里是是用到了 csproj / NuGet 等的額外博客:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容