如何更改 EnvDTE.Document 的文本?

How can I change the text of an EnvDTE.Document?

我使用以下代码将新的 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();
        }
    }

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

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

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

这是损坏的文本的样子:

但这是我分配的:

  ...
  ...
  },
  "client": {
    "title": "Mr"
  }
}

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

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

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

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