0

我正在使用 Wix Toolset 3.11 并尝试创建一个 Wix 引导程序,该引导程序正在为我的软件安装一个非常大的先决条件 - 一个遗留的 InstallShield 可执行文件,在 ~600 个文件夹中找到 ~5000 个相关文件。我已将所有这些文件压缩成一个大约 3GB 的自解压存档。尝试构建时出现以下错误:

light.exe(0,0):错误 LGHT0001:算术运算导致溢出。

这是我当前在引导程序中的相关 XML:

<Chain>
   <PackageGroupRef Id="MyPrerequisites"/>
   <PackageGroupRef Id="ReallyBigExe"/>
   <PackageGroupRef Id="OtherStuff"/>
</Chain>
<Fragment>
   <util:RegistrySearch Id=ReallyBigExeFound" Key="Assume searching stuff is here"/>
   <PackageGroup Id=ReallyBigExe">
      <ExePackage InstallCondition="ReallyBigExeFound"
                  Compressed="no" 
                  DisplayName="Install Really Big Thing"
                  Permanent="no"
                  SourceFile="Packages\ReallyBigThing.exe"
                  Name="ReallyBigThing.exe"/>
   </PackageGroup>
</Fragment>

我尝试了压缩、缓存、名称等的不同变体,都导致相同的错误。我知道这是由于包含的 exe 文件很大;在此处查看Github 问题

我还看到分离的容器应该有助于解决这个问题。我尝试了几种将容器与我的 PackageGroup 结合使用的组合,但也无济于事。

所以,问题是:我如何在我的安装程序中包含这个非常大的 exe 包,以便我将它安装在包链中,但不将它嵌入到引导数据文件中?

4

1 回答 1

1

我对这个问题的解决方案:

我们不想跟踪外部“ReallyBigExe”的文件,因为它应该是一个独立的产品。我没有将 5k 文件打包到安装程序中的有效负载中,而是创建了一个允许执行任意可执行文件的实用程序:

static int Main(string[] args)
{
  // Check your arguments here

  string path = args[0];
  string executable = args[1];
  path = Path.GetDirectoryName(path);
  path = Path.Combine(path, executable);

  try
  {
    if(!File.Exists(path)) throw new FileNotFoundException();
    Process p = new Process()
    {
      StartInfo = new ProcessStartInfo(path)
    };
    p.Start();
    p.WaitForExit();
  }
  catch(Exception)
  {
    return -1;
  }
  return 0;
}

我启动这个 exe 作为安装过程的一部分,并带有要安装的外部可执行文件的参数:

<ExePackage SourceFile="$(var.MyUtility.TargetDir)MyUtility.exe"
            Compressed="yes">
  <CommandLine InstallArgument="[WixBundleOriginalSource] Data\setup.exe"/>
</ExePackage>

我的外部安装程序必须位于相对于实际引导程序 exe 的 .\Data\ 中,但可以修改参数以指向任何路径。在大多数情况下,这也可以通过自定义操作来完成;在我的情况下,外部 exe 正在安装 SQL Server,当通过自定义操作启动安装时它会挂起。

于 2017-08-17T15:17:41.533 回答