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

Posted

技术标签:

【中文标题】托管引导程序:提示输入源时失败【英文标题】:Managed Bootstrapper: Failed while prompting for source 【发布时间】:2016-03-30 12:38:30 【问题描述】:

我在我的托管引导程序 (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 中,此对话框被禁止。

问题:

    如何手动设置LocalSource(可能是通过用户对话输入)? 我可以在运行时将WixAttachedContainer 设置为其他一些工作路径,但接受用户的输入吗? 我们可以在运行时设置Engine.SetLocalSource() 吗?

非常感谢...

【问题讨论】:

【参考方案1】:

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

    ResolveSource事件处理程序中,我调用了Engine.SetLocalSource(), 然后调用Engine.Detect()

这将重置所有搜索等,并使用e.LocalSource 中的更新路径重新启动添加/删除/卸载/修复会话。现在运行良好。

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

我几乎想通了它会被注入的地方,只需要再次淹没在代码中(实际上是它的 MVVM :()

【讨论】:

【参考方案2】:

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

    覆盖或挂钩ResolveSource 事件。 使用SetLocalSource()更改容器的LocalSource 将事件的Result设置为Result.Retry

参见以下示例:

    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;
    

【讨论】:

以上是关于托管引导程序:提示输入源时失败的主要内容,如果未能解决你的问题,请参考以下文章

无法从托管引导程序应用程序 C#-代码中的引导程序变量读取输入

无法从另一个托管引导程序应用程序卸载 WiX 托管引导程序应用程序

如何删除GRUB 引导信息?

托管引导程序应用程序“无法解析文件源”

托管的 WiX 引导程序包

[Wix Bundle Managed Bootstrapper]错误 0x80070002:无法创建托管引导程序应用程序