我正在使用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 Issue here。
我也看到过分离的容器应该有助于解决这个问题。我尝试了几个使用容器和我的PackageGroup的组合,也无济于事。
所以,问题是:我如何在安装程序中包含这个非常大的exe包,以便我可以将其安装在包链中,但不会将其嵌入到引导数据文件中?
答案 0 :(得分: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,当通过自定义操作启动安装时,它将挂起。