当我启动另一个进程时,程序突然退出

时间:2013-10-03 16:02:20

标签: c# winforms process


我的程序突然存在,我找不到原因,但我知道代码的哪些部分导致了这个问题。我会试着解释会发生什么......

首先,除了常见的命名空间之外,我在Windows窗体中使用以下命名空间:

using System.Diagnostics;
using System.IO;
using System.Data.OleDb;

我有一个自定义函数,它通过查找最大ID并将其递增1来检索当前的自动增量行ID:

void getCurrentQuestionNo()
{
    //calculate current questionNo based on DB Info
    classDataLayer DL = new classDataLayer();
    OleDbCommand cmd = new OleDbCommand();
    cmd.CommandText = "SELECT MAX([questionID]) FROM questions";
    DataSet ds = DL.select(cmd);
    questionNo = Convert.ToInt32(ds.Tables[0].Rows[0][0]) + 1;
}

此函数在form_load函数内启动,用于设置名为questionNo的全局变量供以后使用。

此外,我还有以下代码来打开Microsoft Word应用程序的实例。此代码放在按钮的单击事件中:

try
{
    //copy an instance of empty question template to Temp folder
    File.Copy(@"Templates\EmptyQuestion.docx", @"Temp\TempQuestion.docx", true);
    //launch ms-word to open the document
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.FileName = "WINWORD.EXE";
    startInfo.Arguments = @"Temp\TempQuestion.docx";
    Process.Start(startInfo);
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

问题:
用于检索最后一个问题的代码和打开单词文档的任何一个单独工作。我的意思是当我在form_load中调用getCurrentQuestionNo()时,它可以工作,没有问题。当我在form_load中禁用getCurrentQuestionNo()函数时,启动word进程的代码工作正常。
但是,当我在form_load中调用getCurrentQuestionNo()然后单击按钮启动word进程时,仍然一切正常但是突然之后几秒钟整个程序退出没有任何消息,这个词仍在运行。就像我从Visual Studio IDE中点击“停止”按钮 可能有什么不对?

这在输出窗口中显示:
mscorlib.dll中发生了'System.IO.IOException'类型的第一次机会异常 程序'[5032] test.vshost.exe:Program Trace'已退出,代码为0(0x0) 程序'[5032] test.vshost.exe:Managed(v4.0.30319)'已退出,代码为-2147483645(0x80000003)。

我测试了很多案例,任何使用oleDB以及使用过程都会导致同样的问题。我减少了我的代码如下:
检索上次自动增量ID的代码:

OleDbConnection con1 = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=db.accdb");
OleDbCommand cmd1 = new OleDbCommand("SELECT MAX([questionID]) FROM questions", con1);
con1.Open();
txtID.Text = cmd1.ExecuteScalar().ToString();
con1.Close();

以及启动流程的代码:

Process p = new Process();
p.StartInfo.FileName = "notepad.EXE";
p.Start();

我将它们放在两个单独按钮的点击事件中。再次单击按钮时,每个按钮再次正常工作,然后单击button1然后按钮2崩溃程序!
我真的很困惑...... :(
有趣的是,有时程序不会自行退出,一切都继续工作,但在这种情况下,当我正常关闭程序时,“vshost.exe已停止工作”对话框出现。问题详细信息显示ntdll.dll是故障模块,有时是clr.dll。 我也得到了这个:故障模块名称:StackHash_4d02

1 个答案:

答案 0 :(得分:0)

我非常怀疑你的问题是DLL损坏了。我说它更可能是丢失的DLL,或者是32/64位不匹配。下载Dependency Walker的副本并针对您的应用运行它。如果您缺少DLL或Windows发现的DLL与架构不匹配,它会告诉您。只需确保并为您的应用下载正确的版本(32对64位)。