未在 wxs 中指定 ProgramFilesFolder 的 ProgramFilesFolder 的默认安装路径

Posted

技术标签:

【中文标题】未在 wxs 中指定 ProgramFilesFolder 的 ProgramFilesFolder 的默认安装路径【英文标题】:Default install path to ProgramFilesFolder without specifying ProgramFilesFolder in wxs 【发布时间】:2020-01-30 15:44:07 【问题描述】:

我目前有一个创建 MSI 的旧版 Visual Studio 安装项目项目。有了这个,我可以在命令行上指定“TARGETDIR="somepath"”并将其安装到“somepath”。现在使用 WIX,如果我没有在我的 wxs 中指定 ProgramFilesFolder,“TARGETDIR”仍然有效,但是在我的安装程序 UI 中,默认路径是“C:\Manufacturer\Product”,而我仍然希望它默认为 ProgramFilesFolder。必须支持“TARGETDIR”才能支持从应用程序本身升级到旧版 MSI。

我找到了一些将 UI 默认目录更改为 ProgramFilesFolder 的方法,但是 TARGETDIR 不会更改为此目录(或用户指定的目录),因此它仍会安装到 C:\Manufacturer\Product。

这里有人有什么想法吗?我猜某种自定义操作会做到这一点,但我觉得我已经尝试了大部分建议,例如:

https://***.com/a/13058798/9993088 但这会覆盖命令行中或命令行中的任何选定目录 我还尝试创建一个 WiX 属性“TARGETDIR”以在命令行上公开它,但由于这已经是一个内部属性,因此没有任何区别。 How to set default value of WiX Msi install path in the ui to Program Files? 如前所述,这将阻止我在命令行上使用“TARGETDIR” https://wixtoolset.org//documentation/manual/v3/wixui/dialog_reference/wixui_advanced.html 然后使用自定义操作将“TARGETDIR”设置为“APPLICATIONFOLDER”。有了这个,我可以将默认位置设置为 ProgramFilesFolder,但是我还没有找到一种方法来在正确的时间设置“TARGETDIR”以使用命令行值或用户选择的值。我几乎需要一种方法来执行“如果 'APPLICATIONFOLDER' 不是默认值;使用它的值或者如果 'TARGETDIR' 不是默认值;使用它的值否则使用默认值”。这似乎也不允许变量扩展,所以我不能使用“[ProgramFilesFolder]”,我必须明确写出“C:\Program Files...”,这并不理想。
<Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLDIR" Name="blah">

如前所述,我必须能够使用“TARGETDIR”而不是“INSTALLDIR”(尽管可以)。

如果我真的必须使用“INSTALLDIR”,那么我可以让它工作,但由于使用方式的性质,它使得维护旧版 MSI 和 WiX 变得很棘手。 p>

编辑

解决方案: &lt;Custom Action="SetINSTALLDIR" Before="AppSearch"&gt;Not Installed&lt;/Custom&gt;InstallExecuteSequenceInstallUISequence 中。

这指向: &lt;CustomAction Id="SetINSTALLDIR" BinaryKey="CustomActionsBinary" DllEntry="SetInstallDir" /&gt;

SetInstallDir 如下:

[CustomAction]
public static ActionResult SetInstallDir(Session session)

    TraceLogger.yRTraceInfo(nameof(SetInstallDir));
    string installDir = session["APPLICATIONFOLDER"];
    string targetDir = string.Empty;

    try
    
        targetDir = session["TARGETDIR"];
    
    catch (Exception e)
    
        Console.log(e.Message);
    

    if (string.IsNullOrEmpty(installDir) && !string.IsNullOrEmpty(targetDir))
    
        session["APPLICATIONFOLDER"] = targetDir;
        console.log($"Setting APPLICATIONFOLDER to targetDir");
    
    return ActionResult.Success;
    

【问题讨论】:

【参考方案1】:

我想如果 INSTALLDIR 为空且 TARGETDIR 有一个值且未安装,您可以有一个 SetProperty 自定义操作来为其分配一个值。在 AppSearch 之前的 Install UI 和 Install Execute 序列中尽早安排它。

WiX INSTALLLOCATION 中的仅供参考更常用。 INSTALLDIR 更像是 InstallShield,而 TARGETDIR 更像是 Visual Studio。

<SetProperty Id="INSTALLDIR" Value="[TARGETDIR]" Before="AppSearch">Not INSTALLDIR and TARGETDIRDIR and Not Installed</SetProperty> 

【讨论】:

谢谢,这似乎成功了。用实施细节更新了我的问题。 我并不是要您编写自定义操作,而是要简单地使用 SetProperty。使用未经测试的示例更新了答案。 FWIW,当您想要拥有额外的业务逻辑(例如检查目录是固定的本地磁盘)时,自定义操作方法可能很有用,但否则只会增加安装的复杂性和可能的​​故障点。

以上是关于未在 wxs 中指定 ProgramFilesFolder 的 ProgramFilesFolder 的默认安装路径的主要内容,如果未能解决你的问题,请参考以下文章

反应警告:失败的上下文类型:所需的上下文“路由器”未在“组件”中指定

未在 distributionManagement 元素内的 POM 或 -DaltDep loymentRepository=id::layout::url 参数中指定存储库元素

未在代码中指定的交换上的MassTransit ACCESS_REFUSED

如何从源文件夹复制所有文件,而不在WIX安装程序配置中指定文件名

未在指定架构中创建表

具有多个值的 CASE 语句