我已经在C#Windows窗体中构建了一个程序,现在在第一次加载时尝试创建计划任务。如果它引发异常并且它在主计算机中,则这是第一次加载软件(您可以在许多计算机上安装此程序,但一台计算机是计划任务的主要部分)。
我在很多计算机上尝试过这个程序,它完美运行(XP-SP1 / 2,Vista-SP1 / 2,Win7),现在当我尝试在有限的用户上安装它时(在Win XP Pro SP2上)它尝试创建计划任务。我得到一个参数空引用,当我进入管理员用户时,它会在管理员用户上安装计划任务,如果有限用户登录则不会运行(这是99.9%的时间)。为什么我得到这个例外?我在代码上搜索了几个小时,搜索了这个异常的原因,但我找不到了!
非常感谢!
阿米特
MainOrSec = true;
User和Pass是从FirstTimeUp返回的公共变量。
private bool CreateNoExit()
{
try
{
RegistryKey key = Registry.CurrentUser;
key = key.OpenSubKey("Crm");
MainOrSec = Convert.ToBoolean(AESIMP.Decrypt((string)key.GetValue(AESIMP.Encrypt("MorS"))));
}
catch (ArgumentNullException)
{
MainOrSec = true;
}
if (MainOrSec)
{
ScheduledTasks sc = new ScheduledTasks();
Task task;
try
{
task = sc.CreateTask("NoExit");
FirstTimeUp f = new FirstTimeUp(this);
f.ShowDialog();
}
catch (ArgumentException)
{
return false;
}
if (!CreatT)
return false;
task.ApplicationName = @"C:\Program Files\Triffon\Crm Setup
2.0.0002\noexit.exe";
task.Comment = "Check For no exit on the database.";
task.SetAccountInformation(User, Pass);
task.IdleWaitMinutes = 10;
task.Triggers.Add(new DailyTrigger(5, 0));
try
{
task.Save();
task.Close();
sc.Dispose();
}
catch (COMException ex)
{
MessageBox.Show(ex.Message);
return false;
}
return true;
}
return false;
}
答案 0 :(得分:4)
如果没有堆栈跟踪很难解决这个问题,但是存在可疑的代码行。
根据MSDN RegistryKey.GetValue()
返回:
与name或a关联的值 null引用(Visual中没有任何内容 基本)如果找不到名字。
在这里,您将该函数的结果直接传递给另一个函数:
MainOrSec = Convert.ToBoolean(AESIMP.Decrypt((string)key.GetValue(AESIMP.Encrypt("MorS"))));
尝试通过几个步骤调用它,在需要的地方检查null:
string s = key.GetValue(AESIMP.Encrypt("MorS")) as string;
if(!string.IsNullOrEmpty(s))
MainOrSec = Convert.ToBoolean(AESIMP.Decrypt(s));
else
MainOrSec = true;
答案 1 :(得分:4)
好的,所以如果你遇到异常,最好的办法是在Visual Studio的调试器下运行你的程序,这样你就可以确切地看到调用异常的位置。在这里, Ctrl-Alt-E 是你的朋友:打开“Common Language Runtime Exceptions”旁边的“Thrown”列中的复选框,无论如何你都会打破调试器。
如果您在没有Visual Studio的用户计算机上测试应用程序,那么您还有其他选择。一个(如果你使用Pro及以上)是在远程PC上运行Remote Debugger。然后,您可以附加到正在运行的程序并查看异常。
如果您没有Pro,或者无法轻松使用远程调试器,那么绝对值得使用像log4net这样的合适的日志记录框架来确保捕获,捕获和写入所有异常到日志文件。坦率地说,在完成之前不应该发布生产应用程序。
完成此操作后,请仔细查看异常跟踪以查看问题的原因。我愿意打赌,ScheduledTasks
类正在某个你不期望的地方抛出异常。
最后,你会得到一些投票,因为这里的文化是“如果你告诉我们需要知道的一切来帮助我们,我们会帮助你。”在评论中有一些请求没有出现完整的堆栈跟踪,所以这里的人会认为这很粗鲁,我很害怕。