C# 如何更改EnvDTE.Document的文本?

C# 如何更改EnvDTE.Document的文本?,c#,json,visual-studio-extensions,envdte,roslyn-code-analysis,C#,Json,Visual Studio Extensions,Envdte,Roslyn Code Analysis,我使用以下代码为文档分配新的json文本: public virtual async Task SetDocumentText(FileInfo fileInfo, string contents) { if (fileInfo == null) throw new ArgumentNullException(nameof(fileInfo)); var projectItem = FindDTEProjectItem(fi

我使用以下代码为文档分配新的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();
        }
    }
但目前的解决方案有三个问题:

  • json文本已损坏
  • 分配新文本非常慢
  • 将选中文档中的所有文本
  • 是否有更好的方法将新文本分配给EnvDTE.Document

    这就是损坏的文本的外观:

    但这是我分配的:

      ...
      ...
      },
      "client": {
        "title": "Mr"
      }
    }
    
    我分配的json文本有效且格式良好,即使不是,我也不会期望json文本会出现如此严重的损坏

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


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

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

    为什么要异步处理DTE对象?我相信它们不是线程安全的。@SergeyVlasov谢谢你的提示。我修正了密码。我认为Document.Save()或解决方案扫描不是问题。但是它可能是。谢谢,我在insert flag
    vsInsertFlagsContainNewText
    上看到可以用来覆盖所选文本。
    vsInsertFlagsCollapseToEnd
    标志指示将光标移动到插入的右侧,然后取消选择文本。听起来很有希望。