在 VS 扩展中使用内置 Visual Studio Diff 工具





5.00/5 (10投票s)
一种在 Visual Studio 扩展内部调用内置 Visual Studio 命令的方法
背景
有一次,当我重新发明轮子(编写自定义 JSON 查看器/比较器)时,我遇到了以下问题:我想在 Visual Studio 扩展中比较 JSON 数据,但我不想编写自己的比较器。我决定使用内置的 Visual Studio 工具。
这个工具众所周知,你可以在命令窗口中调用 DiffFiles
命令
Tools.DiffFiles c:\file1 c:\file2
然而,如何从 Visual Studio 扩展中执行此命令,而无需命令窗口和无需创建另一个 Visual Studio 实例,对我来说是一个难题。在网上搜索了几个小时并进行了一系列测试后,我得出了一个简单的解决方案,我想在这里描述一下。
解决方案
具有 UI 的 Visual Studio 扩展的主窗口是从 Microsoft.VisualStudio.Shell.ToolWindowPane
继承的。这个对象具有 Package
属性,它实现了 System.IServiceProvider
接口。该接口提供对 Visual Studio COM 根对象 的访问。以下是完善且简化的代码,用于演示该解决方案
public void CompareJsonData(IServiceProvider serviceProvider, string data1, string data2)
{
var tempFolder = Path.GetTempPath();
var tempFile1 = Path.Combine(tempFolder, Guid.NewGuid().ToString());
File.WriteAllText(tempFile1, data1);
var tempFile2 = Path.Combine(tempFolder, Guid.NewGuid().ToString());
File.WriteAllText(tempFile2, data2);
DTE dte = (DTE)serviceProvider.GetService(typeof(DTE));
dte.ExecuteCommand("Tools.DiffFiles",
string.Format("\"{0}\" \"{1}\" \"{2}\" \"{3}\"", tempFile1, tempFile2,
"1st JSON data", "2nd JSON data"));
}