Roslyn 通過 EmbedAllSources 將原始碼嵌入到 PDB 符號檔案中方便開發者除錯
本文來告訴大家如何在專案檔案裡面新增上 EmbedAllSources 屬性,將自己的程式碼嵌入到 PDB 符號檔案裡面,讓開發者們在除錯的時候,可以看到庫的原始碼
是否記得 PDB 符號檔案的作用?符號檔案將會記錄著 DLL 檔案裡面的二進位制內容和原始碼之間的對應,根據 PDB 符號檔案將可以關聯上 DLL 和原始碼。假設此時既有 PDB 符號檔案,又有原始碼,那自然就可以在除錯的時候進入原始碼進行除錯
為了減少誤解,必須說明的是,有 PDB 符號檔案,可以方便進行程式碼關聯除錯。對於 .NET 的應用,沒有 PDB 符號檔案,依然可以愉快除錯,原因是 .NET 的 DLL 裡面自帶了足量的資訊。但是有 PDB 符號檔案的話,除錯更好評
預設的釋出的庫,都是不會帶上原始碼的,此時空有 PDB 符號檔案,還不能愉快除錯原始碼。好在咱可以使用 EmbedAllSources 屬性,將原始碼嵌入到 PDB 符號檔案裡面,此時在 VisualStudio 2019 除錯,將可以通過 PDB 檔案除錯進入到對應的原始碼
將原始碼放入到 PDB 符號檔案的方法很簡單,只需要在 csproj 專案檔案新增如下程式碼即可
<EmbedAllSources>true</EmbedAllSources>
預設的 NuGet 包是不帶 PDB 符號檔案的,官方推薦將 PDB 符號檔案打到 snupkg 裡面再推送。如果期望只作為一個 NuGet 包,可以加上如下程式碼也將符號檔案放入 NuGet 裡面。使用下面程式碼可以將 PDB 符號檔案放入 NuGet 包,也將原始碼打包壓縮嵌入在 PDB 符號檔案裡面
<PropertyGroup> <EmbedAllSources>true</EmbedAllSources> <!-- Include symbol files (*.pdb) in the built .nupkg --> <AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder> </PropertyGroup>
更改之後的 csproj 專案檔案內容大概如下
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<TargetFrameworks>net45;netcoreapp3.1</TargetFrameworks>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<UseWpf>True</UseWpf>
<UseWindowsForms>True</UseWindowsForms>
</PropertyGroup>
<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<EmbedAllSources>true</EmbedAllSources>
<!-- Include symbol files (*.pdb) in the built .nupkg -->
<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
</PropertyGroup>
加上了 EmbedAllSources 就可以看到輸出的 PDB 符號檔案的體積比之前更大,原因是加上了原始碼檔案
在有嵌入原始碼的符號檔案,就可以在除錯的時候,自動進入到原始碼。但是和有原始碼的除錯不同的在於,此時的原始碼是不支援更改邏輯的。另一個不足在於當前只支援 cs 等程式碼檔案,還不支援 xaml 檔案
此功能其實也是 SourceLink 的一個功能,需要 VisualStudio 2019 新版本才能支援。如果自己的程式碼是開源的,也可以通過 SourceLink 連結到 GitHub 等的方式,這樣可以減少 NuGet 包的下載大小。詳細請看 dotnet 使用 SourceLink 將 NuGet 連結原始碼到 GitHub 等倉庫
其實將原始碼放入 PDB 檔案會比使用 SourceLink 連結到 GitHub 上更好,原因是從 GitHub 上拉程式碼的速度不如下一個大的 NuGet 檔案
更多關於 Roslyn 請看 手把手教你寫 Roslyn 修改編譯
部落格園部落格只做備份,部落格釋出就不再更新,如果想看最新部落格,請到 https://blog.lindexi.com/
本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名[林德熙](http://blog.csdn.net/lindexi_gd)(包含連結:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我[聯絡](mailto:[email protected])。