Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从VSPackage获取当前运行的Visual Studio安装路径_C#_Visual Studio_Visual Studio Extensions_Vsx_Vspackage - Fatal编程技术网

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

C# 如何从VSPackage获取当前运行的Visual Studio安装路径,c#,visual-studio,visual-studio-extensions,vsx,vspackage,C#,Visual Studio,Visual Studio Extensions,Vsx,Vspackage,我创建了一个VSPackage,它应该将一些XML架构文件复制到Visual Studio的安装路径:%VS安装路径%\XML\Schemas 我的机器上安装了多个Visual Studio: Visual Studio 2013专业版 Visual Studio 2015社区版 VisualStudioExpress版本 我需要检测到我的VSPackage正在执行其命令的visualstudio的路径 如何在包中获取当前运行的Visual Studio的安装路径?您的包将无法将文件复制到V

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

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

  • Visual Studio 2013专业版
  • Visual Studio 2015社区版
  • VisualStudioExpress版本
我需要检测到我的
VSPackage
正在执行其命令的
visualstudio
路径


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

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

也就是说,见:


.

首先,我同意卡洛斯的观点,即扩建工程不应要求提高特权。但这并不意味着你的问题无法解决;我只是建议用另一种方式

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

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
控制台应用程序将执行需要提升权限的工作。包使用
进程
类创建一个新进程;映像的文件路径可以从定义程序集获得(因为如果包是从VSIX安装的,那么这可能是一个随机路径)

由于清单将涉及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
参数可从属性中获取…

最终通过以下代码找到安装路径:

   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;

好把戏。是的,可以用不同的过程来完成。应用程序清单甚至可以通过以下代码避免和提升:HOWTO:从Windows Vista或更高版本的Visual Studio加载项启动具有管理员权限的进程()这回答了我的另一个问题。如果你把它移到那里,我可以接受答案。谢谢你,(-);
   var test = ((EnvDTE.DTE)ServiceProvider.GlobalProvider.GetService(typeof(EnvDTE.DTE).GUID)).FullName;
   VISUAL_STUDIO_INSTALLATION_PATH = Path.GetFullPath(Path.Combine(test, @"..\..\..\"));
 EnvDTE.DTE dte = (EnvDTE.DTE)Package.GetGlobalService(typeof(EnvDTE.DTE));
 VISUAL_STUDIO_VERSION = dte.Version;