【问题标题】:Trying to read a file and then write a file during a WiX install in a CustomAction尝试在 CustomAction 中的 WiX 安装期间读取文件然后写入文件
【发布时间】:2016-04-27 06:43:19
【问题描述】:

我在这方面遇到了困难。关于这些settings,有一个lotofSO articles,但我仍然卡住了。

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

  1. 读取将随 msi 物理附带的文件。也就是说,会有setup.exe、test.msi、specialFile.txt三个文件

  2. 在安装过程中,我想在安装路径中创建一个新文件。 C:\Program Files\MyCompany\MyApplication\newFile.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,它应该是指安装应用程序的路径。它似乎是这样做的。 session["INSTALLFOLDER"]

最后一个问题是,当我直接执行 .msi(无引导程序)并将 deferred 更改为 immediate 时,我能够读取 session["sourceDir"] 并且它确实是我想要的 .msi 的位置.当我使用 setup.exe 引导程序时,这个相同的变量指向一个内部系统目录,看起来 MSI 被复制到该目录。我想让用户拥有两种执行方法(有和没有 setup.exe 引导程序),并且能够以某种方式访问​​这些路径。

更新:

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

【问题讨论】:

    标签: c# session wix


    【解决方案1】:

    这样就可以解决问题了:

    <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>   
    

    在自定义操作中,您可以通过 session.CustomActionData["propertyname"] 访问 MyActionsName.CustomActionData 中的数据集

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

    我刚刚看到我来晚了。但也许其他人会觉得这很有帮助。

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多