我有windows应用程序检查adobe acrobat是否安装在PC中如果安装了pdf文件将显示从cd如果没有安装安装程序窗口出现设置acrobat我做了我的代码将但我想在pdf文件运行时窗户形式处理我做了,但这出现了:
无法访问已处置的对象。对象名称:'Checker'。
public Checker()
{
InitializeComponent();
Check();
}
//static void main()
//{
// Checker ck = new Checker();
// ck.Show();
// Application.Run();
//}
public void Check()
{
try
{
DriveInfo[] allDrives = DriveInfo.GetDrives();
RegistryKey adobe = Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("AMD");
if (adobe == null)
{
panel1.Show();
}
else
{
foreach (DriveInfo d in allDrives)
{
switch (d.DriveType)
{
case DriveType.CDRom:
Process myProcess = new Process();
myProcess.StartInfo.FileName = d.Name + "Environment.docx";
myProcess.Start();
break;
}
}
}
}
catch
{
MessageBox.Show("error occured");
}
this.Dispose();
}
答案 0 :(得分:2)
在绝大多数情况下,您应该不在您的代码中调用this.Dispose()
。通过将此调用放在从构造函数调用的方法中,您实际上是将当前对象从您自己的下方处理出来。当您尝试通过调用其Show
方法访问下一行的表单对象时,运行时会检测到该错误并向您显示错误。
在这种情况下,如果您想在Check
方法完成后关闭表单,则应该调用Close
method:
this.Close();
答案 1 :(得分:2)
您正在做的是创建一个表单,处理它,然后显示它。
使用显式处理很少有好处,但问题是你在处理后试图使用处理对象,因此应用程序崩溃。
尝试使用Check()
关闭this.Close()
方法中的表单,并使用using
语句确保在完成表单后确实会处理该表单,例如这样:
using (Checker ck = new Checker())
{
ck.Show();
}
Application.Run();
答案 2 :(得分:1)
这是因为您在this.Dispose();
方法中调用Check
,该方法是从构造函数调用的。基本上你是在构造函数中处理表单,使其无法使用。
在我看来,好像你应该把逻辑分开一点。创建一个执行检查的方法,返回一个bool
,指示是否应该显示表单,然后只有在屏幕上显示时才创建和显示表单。
答案 3 :(得分:0)
您已经在构造函数中调用的Check()方法中处理了表单。
然后执行show方法,在此阶段,您已经处置了对象。
自动释放.net中的内存,为什么要显式调用dispose?
答案 4 :(得分:0)
处理表单与退出应用程序不同。 尝试Application.Exit()。