首先,我同意 Carlos 的观点,即扩展永远不应该要求提升特权。但这并不意味着您的问题无法解决;我只是建议以另一种方式来做......
我的一个扩展程序也有类似的问题;我正在寻找一种不需要 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;
}
visualStudioVersion参数可以从DTE.Version属性中获取...