以编程方式取消启动SQL Server Express安装

时间:2009-03-09 08:59:56

标签: c# .net sql-server installer process

在我的应用程序设置期间,用户可以选择在本地计算机上安装新的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}}作为子进程。所以这个问题变得更加困难。 =(

1 个答案:

答案 0 :(得分:2)

如果您等到安装程序完成后会怎么样 - 如果用户已取消主进程 - 您 un 立即安装

我知道这是一个更耗时的过程,但它很简单明了。