如何更改 EnvDTE.Document 的文本?

Mar*_*ing 3 c# json envdte visual-studio-extensions roslyn-code-analysis

我使用以下代码将新的 json 文本分配给文档:

    public virtual async Task SetDocumentText(FileInfo fileInfo, string contents)
    {
        if (fileInfo == null)
            throw new ArgumentNullException(nameof(fileInfo));
        var projectItem = FindDTEProjectItem(fileInfo.FullName);
        if (null == projectItem?.Document)
            await Task.Run(() => fileInfo.WriteAllText(contents));
        else
        {
            var textSelection = (TextSelection)projectItem.Document.Selection;
            textSelection.SelectAll();
            textSelection.Text = contents;
            projectItem.Document.Save();
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是我目前的解决方案存在三个问题:

  1. json 文本已损坏。
  2. 分配新文本非常慢。
  3. 文档中的所有文本都被选中。

有没有更好的方法将新文本分配给 EnvDTE.Document?

这是损坏的文本的样子:

在此处输入图片说明

但这是我分配的:

  ...
  ...
  },
  "client": {
    "title": "Mr"
  }
}
Run Code Online (Sandbox Code Playgroud)

我分配的 json 文本是有效且格式良好的,即使不是,我也不希望 json 文本出现如此严重的损坏。

如果我将文本直接写入文件,那么 Visual Studio 将询问用户是否要重新加载,我也试图避免该弹出窗口。

任何帮助,将不胜感激。我无法成功使用 roslyn 和 TextDocument,因为我无法加载 AdditionalDocument。roslyn 项目文档集合中仅包含代码文件。

Ser*_*sov 5

而不是textSelection.Text = contents;您可以使用textSelection.Insert(contents);. 它更快并且可以防止 Visual Studio 更改原始内容。