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;