在我的应用程序设置期间,用户可以选择在本地计算机上安装新的SQL Server Express 2005实例,如果他们由于某种原因不想在其网络中使用已存在的SQL Server 2005。
由于SQL Server安装是可选的,因此我没有将其作为安装程序的先决条件。相反,我只是将sqlexpr32.exe
设置捆绑在我的安装媒体中,并使用适当的命令行参数以编程方式启动它,以便执行自动安装。 (注意:我正在使用/ qb命令行标志,因此安装不是静默的,它显示用户界面,但不要求任何用户输入)。如果有人想知道,我正在关注如何启动SQL Server Express设置的this Microsoft article。
这就是我在自定义安装操作中所做的事情:
// All this runs on a background thread so the user
// can cancel my app's setup at any time
// Launch the installer
Process setupProcess = new Process();
setupProcess.StartInfo.FileName = "sqlexpr32.exe";
setupProcess.StartInfo.Arguments = " a bunch of command line args here";
setupProcess.StartInfo.UseShellExecute = false; // to avoid a shell window
setupProcess.Start();
// At this point the SQL Server installer is running
// Monitor the process on 2-second intervals:
while (!setupProcess.WaitForExit(2000))
{
if(WasCancelled) // flag that is set when the user cancels my app's setup
{
// This following line is my problem. Sending CloseMainWindow does not
// seem to work. The SQL Server installer just keeps running.
setupProcess.CloseMainWindow();
setupProcess.WaitForExit();
break;
}
}
// After this point I build a results report for the user.
// My app's installer does not yet quit even if it was canceled.
所以我的问题是:我怎样才能'告知'SQL Server安装程序进程取消并退出?
此行似乎没有做任何事情:
setupProcess.CloseMainWindow();
这也不起作用:
setupProcess.Close(); // This closes my handle. Not the target process.
我显然不想直接杀死进程,因为我可能会将用户的计算机置于一个不太理想的状态,最好的情况是使用大量垃圾文件,或者更糟糕的是,安装损坏。
有什么想法吗?发送密钥或模拟用户点击?或者希望不那么讨厌的东西?
修改
我想我已经找到了CloseMainWindow
无效的原因:
sqlexpr32.exe
)实际上不是显示SQLServer安装程序的UI的过程,而是一个自解压的exe,它依次启动sql server real { {1}}作为子进程。所以这个问题变得更加困难。 =(答案 0 :(得分:2)
如果您等到安装程序完成后会怎么样 - 如果用户已取消主进程 - 您 un 立即安装 ?
我知道这是一个更耗时的过程,但它很简单明了。