我创建了一个VSPackage
,它应该将一些XML模式文件复制到Visual Studio的安装路径:%VS install path% \Xml\Schemas
。
我的计算机上安装了多个Visual Studios:
我需要检测Visual Studio
正在执行其命令的VSPackage
的路径。
如何在包中获得当前运行Visual Studio的安装路径?
答案 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;