0

我正在创建一个 WIX 安装程序,并且在我的Product.wxs文件中我包含SQLEXPR_x64_ENU.exe在产品安装目录中。我通过这样的自定义操作调用安装命令:

<Property Id="SQLEXPRINSTANCENAME" Value="SQLEXPR" />
<CustomAction Id="SqlInstall"
              FileKey="SqlInstaller"
              ExeCommand="/Q /HIDECONSOLE /ACTION=Install /INSTANCENAME=&quot;[SQLEXPRINSTANCENAME]&quot; /IACCEPTSQLSERVERLICENSETERMS /FEATURES=SQLEngine  /TCPENABLED=1 /SQLSVCACCOUNT=&quot;NT AUTHORITY\Network Service&quot; /SQLSYSADMINACCOUNTS=&quot;Builtin\Administrators&quot; /BROWSERSVCSTARTUPTYPE=&quot;Automatic&quot; /AGTSVCACCOUNT=&quot;NT AUTHORITY\Network Service&quot; /SQLSVCSTARTUPTYPE=&quot;Automatic&quot;"
              Execute="immediate"
              Return="check"
              Impersonate="yes" />

稍后在执行序列声明中我有:

<InstallExecuteSequence>
  <Custom Action="SchedXmlFile" After="InstallFiles">1=1</Custom>
  <Custom Action="SqlInstall" After="InstallFinalize">INSTALLSQLYN = "Yes"</Custom>
  <RemoveExistingProducts After="InstallInitialize" />
 </InstallExecuteSequence>

它运行安装程序正常,但 SQL Server Express 将开始挂起,因此挂起整个 MSI。

如果我使用此命令行并将其复制到命令提示符,则安装完成。

MSI 详细日志记录选项不指示任何内容,并且没有 SQL Server 安装日志的摘要文件。

所以我基本上被卡住了,不知道为什么安装程序卡住了,我不知道该怎么办!

如果有人知道将安装程序包含到 MSI 的更简单方法,请告诉我?或者,如果你能帮我弄清楚它为什么会失败?我没有引导它(这有效,但不允许我的 UI 询问用户是否安装 SQL,知道如何从引导程序中的确认对话框有条件地运行 exepackage?)。我打算将我正在制作的这个 MSI 链接到我的产品安装程序的引导程序中。

4

2 回答 2

1

您不能从 msi 中运行另一个安装程序,因为它已经有一个打开的事务。在运行 msi 之前,您需要使用引导程序来检查和安装 SqlExpress。

在此处查看捆绑/刻录文档。

于 2013-09-17T12:51:02.403 回答
0

对我有用的是在我自己的安装程序中通过 C# 即时自定义操作运行 SQL Server Express 2008 R2 SP1 安装程序。自定义操作启动了新进程 - 带有命令行参数的 sql express 安装程序可执行文件。请参见下面的示例。这适用于 Windows Server 2008 和 Win7。这里的问题是,对于 Windows 8 \ Server 2012,您将需要 SQL Server Express 2008 R2 SP2,因为 SP1 会引发“已知兼容性问题”警告。在 SP2 中,他们更改了安装程序,使其挂在 ExecuteStandardTimingsWorkflow 步骤上。这是我目前的主要障碍。

            using (var myProcess = new Process
                {
                    StartInfo =
                        {
                            FileName = prcssFilePath /*path to the SQLEXPR_x64_ENU.exe or SQLEXPR32_x86_ENU.exe*/,
                            Arguments = cmdLineArgs ?? string.Empty,
                            WindowStyle = (hideWnd) ? ProcessWindowStyle.Hidden : ProcessWindowStyle.Normal
                        }
                })
            {
                if (runAsAdministrator)
                {
                    myProcess.StartInfo.Verb = "runas";
                }
                myProcess.Start();
                myProcess.WaitForExit();
                return myProcess.ExitCode;
于 2013-10-01T17:01:14.467 回答