Roslyn 通過 Target 修改編譯的文件

本文告訴大家如何使用 Target 進行修改編譯時的文件

本文也是帶着一個任務來開始。任務就是本渣是一個腹黑的開發者,想要在開發的過程替換一個文件,讓開發者在編譯出來的文件和他調用的文件是兩個不同的文件。

所以下面讓我告訴大家整個任務的過程,先創建一個項目

創建項目

這裏推薦創建一個 dotnet core 控制檯項目,因爲創建這個項目就是使用 VisualStudio 2017 新的格式

如果創建的是其他的項目,請看我的博客轉換爲 VisualStudio 2017 新的格式

創建替換的文件

現在來創建兩個不同的文件,其中一個文件是讓開發者可以看到的文件,第二個文件是用來替換的實際的文件。

創建的文件是

  • Foo.cs
  • Foo 替換.cs

這裏的兩個文件需要隱藏Foo 替換.cs文件,隱藏的方法請看下面

打開項目文件,通過右擊項目編輯

  <ItemGroup>
    <Compile Remove="Foo 替換.cs" Visible="false"></Compile>
  </ItemGroup>

上面的代碼的意思就是移除 CompileFoo 替換.cs 文件,並且設置不可見

實際設置了移除就可以不設置不可見

類的屬性

爲了讓大家可以看到兩個類的不相同,所以我在兩個類添加了不同的代碼

//Foo.cs
    class Foo
    {
        public string Name { get; set; } = "德熙是逗比";
    }
//Foo 替換.cs
    class Foo
    {
        public string Name { get; set; } = "歡迎訪問我博客 http://blog.csdn.net/lindexi_gd 裏面有大量 UWP、WPF、dotnetcore 相關";
    }

這時在主函數調用一下

        static void Main(string[] args)
        {
            var foo = new Foo();
            Console.WriteLine(foo.Name);

            while (true)
            {
                Console.Read();
            }
        }

編譯時替換

如果運行了上面的代碼,大家也知道會輸出什麼,但是腹黑的本渣就在編譯的時候替換文件

先創建一個 Target 在項目文件,創建一個 Target 需要告訴 Target 的命名和觸發的時間

  <Target Name="DrumearDatroLanecereso" BeforeTargets="BeforeBuild">
   
  </Target>

這裏的觸發時間就是在編譯之前,注意BeforeBuild是需要用戶編譯纔會運行

現在知道了一個在用戶編譯之前的 Target 就可以在裏面將兩個文件替換

  <Target Name="DrumearDatroLanecereso" BeforeTargets="BeforeBuild">
    <ItemGroup>
      <Compile Remove="Foo.cs" Visible="false"></Compile>
      <Compile Include="Foo 替換.cs" Visible="false"></Compile>
    </ItemGroup>
  </Target>

上面代碼是移除 Foo.cs 引用另一個替換的文件,所以這時運行一下就會發現輸出的是

歡迎訪問我博客 http://blog.csdn.net/lindexi_gd 裏面有大量 UWP、WPF、dotnetcore 相關

通過這個方法就可以在編譯時替換文件,也就是給開發者看到很漂亮的代碼,以爲就是很簡單的寫法,然後在編譯的時候就將很好看的代碼替換爲很亂的代碼。

這個方法可以用來做 xaml 的資源引用方式,用來做混淆。還有哪些使用方法就需要大家在開發時去想。

更多關於 Roslyn 請看 手把手教你寫 Roslyn 修改編譯

參見:專欄:Roslyn 入門 - CSDN博客


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章