首先,我同意卡洛斯的观点,即延期不应要求提升特权。但这并不意味着你的问题无法解决;我只是建议用另一种方式来做...
我的一个扩展也遇到了类似的问题;我正在寻找一种不需要 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;
}
The visualStudioVersion
参数可以从DTE版本财产...