2017-06-12 38 views
1

我正在使用roslyn API編寫DiagnosticAnalyzer和CodeFix。如何從roslyn代碼分析器輸出文件?

當我收集了所有的字符串和字符串插值後,我想將它們寫入一個文件,但我不知道如何以最好的方式做到這一點。

當然,我總是可以簡單地做一個File.WriteAllText(...),但我想向用戶公開更多的控制。

我也不能確定如何最好地觸發這個文件的生成,所以我的問題是:

  1. 我不想硬編碼的文件名,這將是最好的方式將此設置公開給代碼分析器的用戶?一個配置文件?如果是這樣,我將如何訪問?即:我如何知道目錄?

  2. 如果文件中缺少一個字符串,我想建議一個代碼修復,如「項目包含更改或新字符串,重新生成字符串文件」。這是做這件事的最好方法嗎?或者是否有可能向Visual Studio添加按鈕或其他東西?

  3. 我從命令行調用devenv.com可執行文件來觸發構建,是否有辦法強制我的代碼修復在構建時或之前/之後運行?或者我必須「手動」加載roslyn解決方案並執行我的codefix?

+0

我剛剛寫了幾乎相同的擴展名,我是爲了獲取const字符串並將它們放到資源文件中進行本地化。我已經編制了一份你需要知道如何去做的事情清單。如果您需要示例代碼,我也可以提供 –

+0

@ johnny5我會認真的!你是否設法「重寫」了InterpolatedStringExpressionSyntax'Instances的格式字符串?我有90%的工作量,當你指定諸如'{i:-10}'之類的東西時,它有時會絆倒。 – riki

+0

不,我只是有一部分寫入最近的resx,我正在本地化字符串 –

回答

1

我剛剛完成了一個項目。有幾件事你需要做/知道。

  1. 您可能需要將您的便攜式類庫切換到類庫。否則就會有麻煩調用File.WriteAllText()

你可以看到如何轉換便攜式類庫到正規here

  • 這將有可能不恰當地試圖當工作將所有更改應用於文檔/項目/解決方案。從文檔/項目/解決方案調用時,更改會預先計算並應用於預覽窗口。如果取消,則觸發撤銷操作以撤消所有更改,如果在此期間寫入文件,並且不註冊撤銷操作,則不會撤消對文件的更改。
  • 我已經開了一個bug與羅斯林,但你可以處理覆蓋情況下,你可以看到預覽怎麼做here

  • 還有一最後一件事你可能需要知道的是如何訪問從中,目前有我寫這樣做here

  • 正如塔馬斯說,你可以使用額外的文件,你可以看到如何做一個破解分析儀解決方案,從而here

  • 您可以使用額外的文件,但我知道我使用資源文件的版本,默認情況下未標記爲附加文件,它們是embeddedResources。
    因此,爲了我的用戶不必手動將資源標記爲additonalFiles,我編寫了一個函數,使用xDoc從csproj文件中獲取與資源文件關聯的Designer.cs文件,如果您選擇解析csproj文件:

    protected List<string> GetEmbeddedResourceResxDocumentPaths(Project project) 
    { 
        XDocument xmldoc = XDocument.Load(project.FilePath); 
        XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003"; 
    
        var resxFiles = new List<string>(); 
        foreach (var resource in xmldoc.Descendants(msbuild + "EmbeddedResource")) 
        { 
         string includePath = resource.Attribute("Include").Value; 
    
         var includeExtension = Path.GetExtension(includePath); 
         if (0 == string.Compare(includeExtension, RESX_FILE_EXTENSION, StringComparison.OrdinalIgnoreCase)) 
         { 
          var outputTag = resource.Elements(msbuild + LAST_GENERATED_TAG).FirstOrDefault(); 
    
          if (null != outputTag) 
          { 
           resxFiles.Add(outputTag.Value); 
          } 
         } 
        } 
        return resxFiles; 
    } 
    
    1

    對於配置文件,您可以使用AdditionalFiles msbuild屬性,該屬性通過上下文傳遞給分析器。見here