如何在 C# 代码中打开旧 Visual Studio 中的 .sln 文件?

How do I open an .sln file in older Visual Studio in C# code?

我实现了一个 .NET 应用程序,用户可以在其中浏览解决方案文件。用户可以选择在Visual Studio中打开这些解决方案文件。

问题是解决方案需要在Visual Studio 2008 年打开。而不是在Visual Studio 2010 年或更高版本。这是将解决方案文件保持在其原始状态所必需的。

这一切都应该在 C# 中发生。下面是代码,但它使用用户的默认 Visual Studio 打开 sln 文件。

if (file.EndsWith(".sln") && File.Exists(file))
    System.Diagnostics.Process.Start(file);

好吧,您只是启动了一个新进程,指示文件到文件,让 Windows 为您处理所有事情。 Windows 知道 .SLN 文件应该使用默认的关联程序打开,仅此而已。

要更改此行为,您必须以编程方式分析 SLN 文件的版本,并根据 SLN 版本打开具体版本的 VisualStudio,将 SLN 文件作为参数传递。

因此您需要从 C# 代码中模拟如下内容:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE>devenv.exe "C:\PATH\SOLUTION.sln"

它可能看起来像这样:

private static void Main(string[] args)
    {
        var slnPath = @"C:\PATH\SOLUTION.sln";
        var slnVersion = GetVersion(slnPath);

        switch (slnVersion)
        {
            case ...:
                break;
            case 14:
                var startInfo = new ProcessStartInfo();
                startInfo.FileName = @"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe";
                startInfo.Arguments = slnPath;
                Process.Start(startInfo);
                break;
        }
    }

在客户端上启动哪个程序取决于注册表项 HKEY_CLASSES_ROOT\VisualStudio。Launcher.sln(由 HKEY_CLASSES_ROOT.sln 引用)

当您打开文件时,它会运行 "c:\Program Files (x86)\Common Files\Microsoft Shared\MSEnv\VSLauncher.exe"“%1”,它会从 .sln 文件中读取版本并打开正确的版本。 关于 .sln 文件结构,您可以在 https://msdn.microsoft.com/en-us/library/bb165951.aspx

阅读

我发现没有必要检测原始版本,因为在其中制作了解决方案。默认情况下,所有解决方案都是在 Visual Studio 2008 年创建的。

在下面的代码中找到解决方案:

在您的代码中添加引用 EnvDTE.dll 和 using EnvDTE;

public static void OpenSlnFile(string file)
{
    System.Type type = Type.GetTypeFromProgID("VisualStudio.DTE.9.0");
    EnvDTE.DTE dte = (EnvDTE.DTE)System.Activator.CreateInstance(type);
    dte.MainWindow.Visible = true;

    dte.Solution.Open(file);
}