65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (10投票s)

2015年1月5日

CPOL
viewsIcon

28962

一种在 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"));
}
© . All rights reserved.