如何从 VSPackage 获取当前 运行 Visual Studio 安装路径

How get the current running Visual Studio installation path from VSPackage

我创建了一个 VSPackage,它应该将一些 XML 架构文件复制到 Visual Studio 的安装路径:%VS install path% \Xml\Schemas.

我的机器上安装了多个 Visual Studio:

我需要检测到 Visual Studio 路径,我的 VSPackage 正在从中执行其命令。

如何获取包中当前运行Visual Studio的安装路径

您的包将无法将文件复制到 VS 安装路径,因为这需要管理员权限,而 VS 默认情况下不会 运行 提升(具有管理员权限),并且包不应该强制 VS 运行 升高。您的包裹的设置可以做到这一点,但您的包裹不能。

也就是说,请参阅:

HOWTO: Get information about the Visual Studio IDE from a Visual Studio package.

首先,我同意 Carlos 的观点,即扩展永远不需要提升权限。但这并不意味着,你的问题无法解决;我只是建议用另一种方式来做...

我的一个扩展程序也遇到了类似的问题;我正在寻找一种不需要 Windows 安装程序设置但适用于纯 VSIX 包的解决方案。我通过创建一个小型控制台应用程序解决了这个问题,我的程序包程序集引用了它。我向控制台应用程序添加了一个应用程序清单,允许我请求所需的执行级别;例如:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

控制台应用程序看起来像...

public class HelperExe
{
    public static int Main(params string[] args)
    {
        // TODO: 
    }
}

控制台应用程序将执行需要提升权限的工作。该包使用 Process class 创建一个新进程;可以从定义程序集获取图像的文件路径(因为如果包是从 VSIX 安装的,这可能是一个随机路径)。

var consoleAssemblyLocation = new Uri(typeof(HelperExe).Assembly.CodeBase);
var file = new FileInfo(consoleAssemblyLocation.LocalPath);
if (file.Exists)
{
    var consoleProcess = new Process 
    {
        StartInfo = new ProcessStartInfo(file.FullName)
        {
            CreateNoWindow = true
        }
    };

    consoleProcess.Start();
    var timeout = (int)TimeSpan.FromMinutes(5).TotalMilliseconds;
    consoleProces.WaitForExit(timeout);
}

由于清单将涉及 UAC 来提升进程...这也有很好的副作用,即用户可以取消该操作。确保您的扩展程序可以处理...

Visual Studio的安装文件夹可以从注册表中读取;您可以通过命令行参数将获得的路径传递给控制台应用程序。我是这样做的...

static string GetVisualStudioInstallationFolder(string visualStudioVersion)
{
    string subKeyName = string.Format(
        CultureInfo.InvariantCulture, 
        @"Software\Microsoft\VisualStudio\{0}_Config", 
        visualStudioVersion);

    using (RegistryKey key = Registry.CurrentUser.OpenSubKey(subKeyName))
    {
        if (key != null)
        {
            return (string)key.GetValue("ShellFolder");
        }
    }

    return null;
}

visualStudioVersion参数可以从DTE.Version属性...

获取

终于找到安装路径,代码如下:

   var test = ((EnvDTE.DTE)ServiceProvider.GlobalProvider.GetService(typeof(EnvDTE.DTE).GUID)).FullName;
   VISUAL_STUDIO_INSTALLATION_PATH = Path.GetFullPath(Path.Combine(test, @"..\..\..\"));

也用于获取 运行 Visual Studio 的版本:

 EnvDTE.DTE dte = (EnvDTE.DTE)Package.GetGlobalService(typeof(EnvDTE.DTE));
 VISUAL_STUDIO_VERSION = dte.Version;