为 DotNet 框架添加一个 ExePackage 元素会起作用,但也可以使用 PayloadGroup:
<PayloadGroup Id="NetFx452RedistPayload">
<Payload Name="redist\NDP452-KB2901907-x86-x64-AllOS-ENU.exe"
SourceFile="X:\path\to\redists\in\repo\NDP452-KB2901907-x86-x64-AllOS-ENU.exe"/>
<PayloadGroup/>
引用此组,使其包含在您的有效负载中:
<BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost">
<PayloadGroupRef Id="NetFx452RedistPayload"/>
您还需要在链中添加对 NetFx452Redist 的引用:
<Chain>
<PackageGroupRef Id="NetFx452Redist" />
在应用阶段,源将无法解析(除非您在相对于您的包名为“redist”的文件夹中有 NDP452-KB2901907-x86-x64-AllOS-ENU.exe)。要指向负载中包含的 NDP452-KB2901907-x86-x64-AllOS-ENU.exe,诀窍是为 ResolveSource 事件添加事件处理程序。
ResolveSource += ResolveSourceHandler;
private void ResolveSourceHandler(object sender, ResolveSourceEventArgs args)
{
try
{
//Everything from the "CurrentBundle" class is from my model.
//The model is built from parsing BootstrapperApplicationData.xml.
//Specifically, payload comes from WixPayloadProperties.
var payload = CurrentBundle.PayloadList.FirstOrDefault(x => string.Compare(x.Id, args.PayloadId, StringComparison.OrdinalIgnoreCase) == 0);
var newPayloadPath = (payload != null) ? Path.Combine(CurrentBundle.WorkingFolder, payload.Name) : string.Empty;
if (File.Exists(newPayloadPath))
{
Engine.SetLocalSource(args.PackageOrContainerId, args.PayloadId, newPayloadPath);
args.Result = Result.Retry;
}
else if (File.Exists(args.LocalSource) == false && string.IsNullOrEmpty(args.DownloadSource) == false)
{
args.Result = Result.Download;
}
}
catch (Exception ex)
{
args.Result = Result.Error;
}
}