尝试读取文件,然后在自定义操作中的 WiX 安装期间写入文件

本文关键字:文件 安装 WiX 操作 读取 然后 自定义 | 更新日期: 2023-09-27 18:31:24

我对此感到很难过。 有很多关于这些设置的SO文章,但我仍然卡住了。

我的目标是执行两个步骤:

  1. 读取将随 msi 一起物理附带的文件。 换句话说,将有三个文件设置.exe,测试.msi,特殊文件.txt

  2. 在安装
  3. 过程中,我想在安装路径中创建一个新文件。C:''Program Files''MyCompany''MyApplication'ewFile.txt

步骤

2 中的文件是通过从步骤 1 中读取 specialFile .txt 中的某些内容来创建的。

我的问题是导航WiX设置的模糊组合,使我能够读取会话变量并具有足够高的权限来写出文件。 这并不容易。

这是我一直在做的事情:

<Binary Id="MyCustomAction.CA.dll" SourceFile="path'to'MyCustomAction.CA.dll" />
<CustomAction Id="MyActionsName"
    Return="check"
    Execute="deferred"
    BinaryKey="MyCustomAction.CA.dll"
    DllEntry="MyCustomAction"
    Impersonate="no"/>
    <CustomAction Id="CustomAction1"
        Property="LookupUnattendedXML"
        Value="INSTALLFOLDER=[I_Can_Get_This_From_The_Directory_Tags];SOURCEDIR=How_To_Get_This???"/>
    
<InstallExecuteSequence> 
    <Custom Action="CustomAction1" Before="MyActionsName" />
    <Custom Action="MyActionsName" Before="InstallFinalize">NOT Installed AND NOT PATCH</Custom>
</InstallExecuteSequence>       
  • impersonate="no",以便有足够的权限来写入文件
  • 执行是"延迟"的,以便有足够的权限来写入文件(我不明白这是如何工作的)
  • 自定义标记设置为 Before="InstallFinalize" 。 我为此尝试了其他设置。 Before="InstallFinalize"似乎在安装文件后触发。

然后在 C# 代码中,我似乎需要访问session才能获得所需的内容。 我要求session["sourceDir"]找出.msi是从哪里启动的,然后搜索specialFile.txt 这不适用于打开"延迟"的情况。 我还访问一个名为 INSTALLFOLDER 的目录 ID,该 ID 应该是指安装应用程序的路径。 它似乎这样做了。 session["INSTALLFOLDER"]

最后一个问题是,当我直接执行.msi(没有引导程序)并将延迟更改为立即时,我能够读取会话["sourceDir"],它实际上是我想要的.msi的位置。 当我使用 setup.exe 引导程序时,这个相同的变量指向一个内部系统目录,其中似乎将 MSI 复制到该目录。 我想让用户拥有两种执行方法(有和没有设置.exe引导程序),并以某种方式能够访问这些路径。

更新:

本文和这篇关于延迟操作中的自定义属性的文章使我能够读取自定义操作中的安装文件夹(现在我知道将文件写入何处)。 剩下的挑战是找出 MSI 的位置,以便我可以在不使用 session["SourceDir"] 的情况下读取文件,因为自定义操作是延迟的。

尝试读取文件,然后在自定义操作中的 WiX 安装期间写入文件

这将解决问题:

<Binary Id="MyCustomAction.CA.dll" SourceFile="path'to'MyCustomAction.CA.dll" />
<CustomAction Id="MyActionsName"
    Return="check"
    Execute="deferred"
    BinaryKey="MyCustomAction.CA.dll"
    DllEntry="MyCustomAction"
    Impersonate="no"/>
    <CustomAction Id="MyActionsName.CustomActionData"
        Property="MyActionsName" <!-- this is important -->
        Value="INSTALLFOLDER=[I_Can_Get_This_From_The_Directory_Tags];SOURCEDIR=[SOURCEDIR];ORIGINALDATABASE=[OriginalDatabase]"/>
    
<InstallExecuteSequence> 
    <Custom Action="MyActionsName.CustomActionData" Before="MyActionsName" />
    <Custom Action="MyActionsName" Before="InstallFinalize">NOT Installed AND NOT PATCH</Custom>
</InstallExecuteSequence>   

在自定义操作中,您可以通过会话访问 MyActionsName.CustomActionData 中的数据集。自定义操作数据["属性名称"]

通常,您必须将要使用的"正常"安装的每个变量/属性显式传递给延迟的自定义操作,以显示在 CustomActionData 中。

我刚刚看到我很晚了。但也许其他人会发现这很有帮助。