1. 程式人生 > 其它 >Roslyn 通過 EmbedAllSources 將原始碼嵌入到 PDB 符號檔案中方便開發者除錯

Roslyn 通過 EmbedAllSources 將原始碼嵌入到 PDB 符號檔案中方便開發者除錯

咱造了一個輪子,咱可以非常方便將這個輪子庫作為 NuGet 釋出出去,造福其他開發者,或者毒害其他開發者。為什麼說是毒害呢?因為有時候這個庫存在坑,此時使用這個庫的開發者就受到了傷害。為了安撫脆弱的開發者們,咱可以提高一下開發者們的除錯效率,例如讓開發者們可以除錯到庫裡面的原始碼。本文來告訴大家如何在專案檔案裡面新增上 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])。