托管引导程序:在提示源时失败

时间:2016-03-30 12:38:31

标签: wix bootstrapper burn

我在Managed Bootstrapper(MBA)中提供3个msi软件包。用户可以选择要安装的软件包。一切顺利。当用户尝试从“控制面板”修改安装时,从对话框中选择新包并且缺少原始源(MBA.exe),安装失败并显示以下日志:

[553C:0A88][2016-03-30T16:00:54]w341: Prompt for source of container: WixAttachedContainer, path: D:\work\MBA.Install.Bundle\bin\Debug\MBA.exe<br/>
[553C:0A88][2016-03-30T16:00:54]e054: Failed to resolve source for file: D:\work\MBA.Install.Bundle\bin\Debug\MBA.exe, error: 0x80070002.
[553C:0A88][2016-03-30T16:00:54]e000: Error 0x80070002: Failed while prompting for source (original path 'D:\work\MBA.Install.Bundle\bin\Debug\MBA.exe').
[553C:0A88][2016-03-30T16:00:54]e311: Failed to acquire container: WixAttachedContainer to working path: C:\Users\Me\AppData\Local\Temp\{1338381A-F85F-4B6D-83EA-A0A2D1A369C1}\10A35D6D6CAC04B3DC248033B1588CBD67AD698B, error: 0x80070002.
[553C:0A88][2016-03-30T16:00:54]i000: CachePackageComplete: Pkg_Id=EMS.Server Resulted=None
[553C:0A88][2016-03-30T16:00:54]i000: CacheComplete: Status=-2147024894
[553C:3C24][2016-03-30T16:00:54]e000: Error 0x80070002: Failed while caching, aborting execution.

我试图在ResolveSource事件处理程序中捕获它。 e.LocalSourcee.DownloadSource是只读属性。没有下载丢失文件的标准,所有都需要在本地出现。

我在这里阅读了有关获取原始安装程序源的提示: https://blogs.msdn.microsoft.com/heaths/2007/10/25/resolvesource-requires-source/

但这是关于msi安装程序,而在我的MBA中,此对话框被禁止。

问题:

  1. 如何手动设置LocalSource(可以通过用户的对话框输入)?
  2. 我可以在运行时将WixAttachedContainer设置为其他工作路径但是从用户那里获取输入吗?
  3. 我们可以在运行时设置Engine.SetLocalSource()吗?
  4. 非常感谢...

2 个答案:

答案 0 :(得分:0)

阅读其他帖子和Wix-Users电子邮件列表的一个好回复后,我得到了部分成功的想法:

  1. ResolveSource事件处理程序中,我调用了Engine.SetLocalSource()
  2. 然后调用Engine.Detect()
  3. 这将重置所有搜索等,并将使用e.LocalSource中的更新路径重新启动添加/删除/卸载/修复会话。现在这个工作正常。

    休息是,我必须努力隐藏会话的重启并继续用户选择新组件的屏幕(或者如果取消选择任何组件),即我猜PlantAction(LaunchAction.Install)

    我几乎想出了这将被注入的地方,只需再次淹没到代码中(实际上它的MVVM :()

答案 1 :(得分:0)

这可能是WiX工具集中的错误 - 请参阅https://github.com/wixtoolset/issues/issues/5586

  1. 覆盖或挂钩ResolveSource事件。
  2. 使用LocalSource
  3. 更改容器的SetLocalSource()
  4. 将活动的Result设置为Result.Retry
  5. 参见以下示例:

    private void OnResolveSource(object sender, ResolveSourceEventArgs e)
    {
        var wixBundleOriginalSource = Application.Engine.StringVariables["WixBundleOriginalSource"];
    
        Application.Engine.Log(LogLevel.Verbose, $"Setting local source for {e.PackageOrContainerId} to '{wixBundleOriginalSource}' (WixBundleOriginalSource)");
        Application.Engine.SetLocalSource(e.PackageOrContainerId, e.PayloadId, wixBundleOriginalSource);
    
        Application.Engine.Log(LogLevel.Verbose, $"Retry to resolve source for {e.PackageOrContainerId}");
        e.Result = Result.Retry;
    }