我正在测试需要提升权限的C#WPF程序,如果我以管理员身份登录,则会毫不拖延地加载,但如果我以标准用户身份登录(99%的时间),那么会有延迟在UI出现之前大约30秒。
在C#控制台应用程序和c#Winforms应用程序中使用相同的高程代码,加载没有延迟,因此我知道代码有效。 那么,任何人都可以向我解释为什么会有与WPF相关的延迟;并且有解决方法吗?
以下是来自app.xaml.cs的代码(项目的其余部分由VS2010生成)
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
using System.Security.Principal;
using System.Diagnostics;
using System.Reflection;
using System.ComponentModel;
using MyNewServiceLib;
using System.Runtime.InteropServices;
namespace WhySoSlow
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
if (!IsAdmin())
{
StartAsAdmin(e);
Application.Current.Shutdown();
}
else
{
MainWindow = new MainWindow();
MainWindow.SizeToContent = SizeToContent.WidthAndHeight;
MainWindow.WindowStartupLocation = WindowStartupLocation.CenterScreen;
MainWindow.Show();
}
}
bool IsAdmin()
{
WindowsIdentity id = WindowsIdentity.GetCurrent();
WindowsPrincipal p = new WindowsPrincipal(id);
return p.IsInRole(WindowsBuiltInRole.Administrator);
}
private void StartAsAdmin(StartupEventArgs e)
{
string[] args = e.Args;
try
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.WorkingDirectory = Environment.CurrentDirectory;
Uri uri = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase);
startInfo.FileName = uri.LocalPath;
startInfo.Arguments = String.Join(" ", args);
startInfo.Verb = "runas";
Process p = Process.Start(startInfo);
}
catch (Win32Exception exception)
{
MessageBox.Show(exception.Message);
}
}
}
}
更多信息 奇怪的是,如果我从NT Authority \ System下运行的cmd提示符启动程序,则启动UI没有延迟。在一次成功启动之后,每次进一步启动,从任何提示,无论是标准用户提示,以管理员身份运行,程序都会立即启动;直到我从会话中注销。 再次登录到新的(标准用户)会话后,所有启动程序的尝试都会在显示UI之前导致30秒的延迟。 我只能认为这是微软的某种UAC,这阻碍了wpf的启动。
答案 0 :(得分:1)
您是否尝试过使用清单文件,而不是使用此代码?以管理员身份运行应用程序是您可以使用它执行的操作之一。
这可能有助于https://msdn.microsoft.com/en-us/library/ms742884.aspx