【问题标题】:How get the current running Visual Studio installation path from VSPackage如何从 VSPackage 获取当前运行的 Visual Studio 安装路径
【发布时间】:2015-06-16 17:56:19
【问题描述】:

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

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

  • Visual Studio 2013 专业版。
  • Visual Studio 2015 社区版。
  • Visual Studio 速成版。

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

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

【问题讨论】:

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


【解决方案1】:

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

我的一个扩展程序也有类似的问题;我正在寻找一种不需要 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;
}

visualStudioVersion参数可以从DTE.Version属性中获取...

【讨论】:

  • 不错的把戏。是的,它可以通过不同的过程来完成。甚至可以通过代码避免和提升应用程序清单:HOWTO:在 Windows Vista 或更高版本上从 Visual Studio 加载项启动具有管理员权限的进程 (mztools.com/articles/2009/MZ2009007.aspx)
  • 这回答了我的另一个问题stackoverflow.com/questions/31212870/…。如果你把它移到那里,我可以接受答案。谢谢
【解决方案2】:

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

也就是说,请参阅:

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

【讨论】:

    【解决方案3】:

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

       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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多