Dot-Net

將自定義編譯器與 Visual Studio IDE 集成

  • April 12, 2018

背景:我想創建一個自定義 VB 編譯器,擴展“原始”編譯器,以處理我的自定義編譯時屬性。

問題:在我創建了我的自定義編譯器並且我有一個能夠通過標準命令行界面編譯 VB 程式碼的執行檔之後,我如何將此編譯器與 Visual Studio IDE 集成?(這樣按“編譯”或“建構”將使用我的編譯器而不是預設編譯器)。

編輯:(如果我錯了,請糾正我)

從這裡的反應,我看到這個問題有點令人震驚,所以我將進一步解釋我的需求和背景:.NET 為我們提供了一個很棒的機制,稱為 Attributes。據我了解,使屬性將其預期行為應用於屬性元素(程序集、模組、類、方法等) - 必須反映屬性。所以這裡真正的訣竅是在正確的位置反映和應用行為。

讓我們以序列化為例:我們用 Serializable 屬性裝飾一個類。然後我們將類的一個實例傳遞給格式化程序的 Serialize 方法。格式化程序反映實例,檢查它是否具有 Serializable 屬性,並採取相應的行動。

現在,如果我們檢查 Synchronization、Flags、Obsolete 和 CLSCompliant 屬性,那麼真正的問題是:誰反映了它們?至少在某些情況下,它必須是編譯器(和/或 IDE)。因此,似乎如果我希望創建自定義屬性來改變元素的行為而不管任何特定的消費者,我必須擴展編譯器以在編譯時反映它們。

當然,這不是我個人的見解:《Applied .NET Attributes》一書提供了創建自定義屬性和自定義 C# 編譯器以在編譯時反映該屬性的完整範例(該範例用於實現“java-style檢查異常”)。

在http://msdn.microsoft.com/en-us/library/ms171452.aspx查看“MSBuild 概述” 。Visual Studio 項目是 MSBuild 項目。我相信你所要做的就是做一些小的改變。我沒有為編譯器做過,但我在編譯後用 ILMerge 做了,效果很好。無縫甚至可以調試合併的程序集。

查看“ BuildAction 屬性”和“ CustomTool 屬性”。

幾年前,我閱讀了一篇關於創建自定義編譯器、註冊它並設置這些屬性的優秀文章。我現在找不到該文章,但這應該可以幫助您入門。

引用自:https://stackoverflow.com/questions/2628914