c# - 如何从 roslyn 代码分析器输出文件?

标签 c# visual-studio roslyn roslyn-code-analysis

我正在使用 roslyn API 编写 DiagnosticAnalyzer 和 CodeFix。

收集完所有字符串和字符串插值后,我想将它们全部写入一个文件,但我不确定如何最好地执行此操作。

当然,我总是可以简单地执行File.WriteAllText(...),但我想向用户公开更多控制权。

我也不确定如何最好地触发此文件的生成,所以我的问题是:

  1. 我不想对文件名进行硬编码,向代码分析器的用户公开此设置的最佳方法是什么?配置文件?如果是这样,我将如何访问它?即:我怎么知道目录?

  2. 如果文件中缺少一个字符串,我想建议一种代码修复,例如“项目包含更改或新的字符串,重新生成字符串文件”。这是最好的方法吗?或者是否可以向 Visual Studio 添加按钮或其他东西?

  3. 我从命令行调用 devenv.com 可执行文件来触发构建,有没有办法强制我的代码修复在构建时或之前/之后运行?或者我是否必须使用 roslyn“手动”加载解决方案并执行我的代码修复?

最佳答案

我刚刚完成了一个关于此的项目。您需要做/了解一些事情。

  1. 您可能需要将可移植类库切换为类库。否则你将无法调用 File.WriteAllText()

您可以了解如何将可移植类库转换为常规here

  • 当尝试将所有更改应用到文档/项目/解决方案时,这可能无法正常工作。从文档/项目/解决方案调用时,会预先计算更改并在预览窗口中应用。如果您取消,则会触发撤消操作以撤消所有更改,如果您在此期间写入文件,并且不注册撤消操作,您将不会撤消对文件的更改。
  • 我已经用 roslyn 打开了一个错误,但您可以通过覆盖预览来处理实例,您可以看到如何执行此操作 here

  • 您可能需要知道的最后一件事是如何从分析器访问解决方案,目前我已经编写了一个 hack here

  • 正如 Tamas 所说,您可以使用其他文件,您可以查看如何执行此操作 here

  • 您可以使用其他文件,但我知道在我使用资源文件的版本上,默认情况下它们不会被标记为附加文件,它们是嵌入式资源。
    因此,为了让我的用户不必手动将资源标记为 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;
    }
    

    关于c# - 如何从 roslyn 代码分析器输出文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44496033/

    相关文章:

    c# - 在 WPF 应用程序中添加和执行小型 .net "scripts"

    c# - 在 Visual Studio 中增加构建修订号

    visual-studio - 如何更改Intellisense工具提示颜色

    c# - Crystal Reports 可以缩放以适合页面吗

    c# - ASP.NET MVC 3 在 JS 中获取编辑器 ID 和名称

    c# - GroupCollection 上无法访问的可枚举扩展方法

    visual-studio - 编辑并继续 : "Changes are not allowed when..."

    c# - 是否可以在 RoslynPad RoslynCodeEditor 控件中包含 globalsType 对象全局的智能感知?

    c# - 如何在 Roslyn 上获取扩展方法?

    c# - 将文件/资源​​移动到 Visual Studio 中的 bin 文件夹