gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:11:49 26 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

我刚刚完成了一个与此相关的项目。您需要做/知道一些事情。

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

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

  1. 当尝试将所有更改应用到文档/项目/解决方案时,这可能不适用于此。从文档/项目/解决方案调用时,更改会预先计算并在预览窗口中应用。如果您取消,则会触发撤消操作以撤消所有更改,如果您在此期间写入文件并且未注册撤消操作,您将不会撤消对文件的更改。

我已经用 roslyn 打开了一个错误,但您可以通过覆盖预览来处理实例,您可以看到如何这样做 here

  1. 您可能需要了解的最后一件事是如何从分析器访问解决方案,目前我已经编写了一个 hack 来执行此操作 here

  2. 正如 Tamas 所说,您可以使用其他文件,您可以了解如何使用 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;
}

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com