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

时间:2015-06-16 17:56:20

标签: c# visual-studio visual-studio-extensions vsx vspackage

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

我的计算机上安装了多个Visual Studios:

  • Visual Studio 2013 Professional。
  • Visual Studio 2015社区版。
  • Visual Studio Express Editions。

我需要检测Visual Studio正在执行其命令的VSPackage路径

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

3 个答案:

答案 0 :(得分:2)

首先,我同意卡洛斯的观点,即延伸不应该要求提升特权。但这并不意味着,你的问题无法解决;我只是建议以另一种方式做到这一点......

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

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

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

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

控制台应用程序将执行需要提升权限的工作。该包使用Process类创建一个新进程;图像的文件路径可以从定义程序集中获取(因为如果从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;
}

可以从DTE.Version属性...

获取visualStudioVersion参数

答案 1 :(得分:0)

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

那就是说,见:

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

答案 2 :(得分:0)

最后设法使用以下代码找到安装路径:

   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;