本文告訴大家如何使用 Target 進行修改編譯時的文件
本文也是帶着一個任務來開始。任務就是本渣是一個腹黑的開發者,想要在開發的過程替換一個文件,讓開發者在編譯出來的文件和他調用的文件是兩個不同的文件。
所以下面讓我告訴大家整個任務的過程,先創建一個項目
創建項目
這裏推薦創建一個 dotnet core 控制檯項目,因爲創建這個項目就是使用 VisualStudio 2017 新的格式
如果創建的是其他的項目,請看我的博客轉換爲 VisualStudio 2017 新的格式
創建替換的文件
現在來創建兩個不同的文件,其中一個文件是讓開發者可以看到的文件,第二個文件是用來替換的實際的文件。
創建的文件是
- Foo.cs
- Foo 替換.cs
這裏的兩個文件需要隱藏Foo 替換.cs
文件,隱藏的方法請看下面
打開項目文件,通過右擊項目編輯
<ItemGroup> <Compile Remove="Foo 替換.cs" Visible="false"></Compile> </ItemGroup>
上面的代碼的意思就是移除 Compile
的 Foo 替換.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 修改編譯