如何从 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 2013 专业.
- Visual Studio 2015 社区版。
- 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;
我创建了一个 VSPackage
,它应该将一些 XML 架构文件复制到 Visual Studio 的安装路径:%VS install path% \Xml\Schemas
.
我的机器上安装了多个 Visual Studio:
- Visual Studio 2013 专业.
- Visual Studio 2015 社区版。
- 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;