プログラムが突然存在し、理由がわかりませんが、コードのどの部分がこの問題を引き起こしているかはわかっています。何が起こるかを説明しようと思います...
まず、一般的な名前空間に加えて、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);
}
問題:
最後の questionNo を取得するためのコードと Word 文書を開くためのコードのどちらも、別々に正常に機能します。つまり、form_load 内で getCurrentQuestionNo() を呼び出すと機能し、問題はありません。form_load 内の getCurrentQuestionNo() 関数を無効にすると、ワード プロセスを起動するコードが正常に機能します。
ただし、form_load 内で getCurrentQuestionNo() を呼び出し、ボタンをクリックしてワード プロセスを起動すると、すべてが機能しますが、数秒後に突然プログラム全体がメッセージなしで終了し、ワードは実行されたままになります。Visual Studio IDE から停止ボタンを押したようなものです。
何が間違っている可能性がありますか?
これは出力ウィンドウに表示されます:
タイプ 'System.IO.IOException' の最初のチャンス例外が mscorlib.dll で発生しました
プログラム '[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();
それらを 2 つの別々のボタンのクリック イベント内に配置しました。繰り返しますが、各ボタンは単独でクリックすると正しく機能しますが、ボタン1をクリックしてからボタン2をクリックするとプログラムがクラッシュします!!!
私は本当に混乱しています... :(
興味深いことに、プログラムが自動的に終了せず、すべてが動作し続けることがありますが、そのような場合、プログラムを通常どおり閉じると、「vshost.exeが動作を停止しました」というダイアログボックスが表示されます. 問題詳細は、ntdll.dll が障害モジュールであり、場合によっては clr.dll であることを示しています。これも取得します: 障害モジュール名: StackHash_4d02