【问题标题】:CustomAction DLL Wix read XML VB 2012CustomAction DLL Wix 读取 XML VB 2012
【发布时间】:2014-04-17 08:21:43
【问题描述】:

我正在为我的 WIX 安装程序编写一个自定义操作来读取包含我的配置数据的 XML 文件。然后这将更新系统配置文件。

我的问题是,当我运行安装程序时,它会在安装程序文件中查找我的 XMl 文件 (temp.xml)。我希望它可以在安装程序运行的路径中找到它,这样我就可以更改配置文件,而不必每次都重新构建 MSI。

Public Shared Function CustomAction1(ByVal session As Session) As ActionResult
        session.Log("Begin CustomAction1")

        Dim installDir = Environment.GetEnvironmentVariable("EnactorInstall")

        Dim doc As XmlDocument = New XmlDocument()
        doc.Load("\Test.xml")
        Dim root As XmlNode = doc.DocumentElement
        Dim nodePorts As XmlNode = root.SelectSingleNode("/config/ports")
        Dim BO As String = nodePorts.Attributes.ItemOf("BO").InnerText
        Dim BP As String = nodePorts.Attributes.ItemOf("BP").InnerText
        Dim EM As String = nodePorts.Attributes.ItemOf("EM").InnerText
        Dim WS As String = nodePorts.Attributes.ItemOf("WS").InnerText

        REM Modify enactor.Xml
        Dim enactorXML = installDir & "config\ProcessingServer\enactor.xml"
        Using file As New FileStream(enactorXML, FileMode.Open, FileAccess.ReadWrite)
            REM read the file to memory
            Dim reader As New StreamReader(file)
            Dim content As String = reader.ReadToEnd()

            REM replace tokens
            content = Replace(content, "{ENVIRONMENT}", BO)
            content = Replace(content, "{DEVICE_TYPE}", EM)
            content = Replace(content, "{DEVICE_ID}", WS)
            content = Replace(content, "{LOCATION_ID}", BP)
            content = Replace(content, "{APPLICATION_HOME}", BO)
            content = Replace(content, "{TRANSACTION_NUMBER}", EM)
            content = Replace(content, "{SESSIONS}", EM)
            content = Replace(content, "{RATE_BOARD_PORT}", BO)

            REM clear the file
            file.SetLength(0)

            REM write back to the file
            Dim writer As New StreamWriter(file)
            writer.Write(content)
            writer.Flush()
            writer.Close()
        End Using

        Return ActionResult.Success
    End Function

【问题讨论】:

    标签: xml vb.net dll wix


    【解决方案1】:

    您是否考虑过使用 WixUtilExtension 提供的 XMLConfig ElementXMLFile Element 来完成您想要实现的相同目标?看看吧。

    【讨论】:

    • 完全同意应该用于 XML 写入但它不支持 XML 读取。
    【解决方案2】:

    如果您的意思是要在与正在安装的 MSI 文件位于同一目录中的文件上运行此命令,则将 [SourceDir] 属性放入 CA,即文件所在的位置:

    http://msdn.microsoft.com/en-us/library/aa371857(v=vs.85).aspx

    但如果您使用任何 WiX 捆绑软件,它可能不需要是自定义操作,因为您可能会在安装文件之前运行它。

    如果文件属于 Windows 安装程序,即它是由 MSI 安装程序安装的,请确保它没有文件哈希。文件哈希在 MSI 文件中,如果您更改文件内容然后 MSI 安装它,哈希将与磁盘上的文件不匹配,并且会出现问题。这就是 msifiler 的用途:

    http://msdn.microsoft.com/en-us/library/aa370108(v=vs.85).aspx

    【讨论】:

    • 我希望它在我的文件部署后运行。我现在一直在尝试让 Wix 设置环境变量以指定位置,然后让 VB 拾取它们并将它们附加到文件名之前。目前,如果我不运行客户操作,我可以获得要应用的环境变量,但是当我在其中添加自定义操作时不会写入它们。
    • 我给出的答案仍然适用,假设我了解您想要做什么。您不需要环境变量。在安装时将 [SourceDir] 写入注册表,这将解析为安装 MSI 的文件夹,您可以从那里复制文件到您的应用程序中。或者使用 MsiSourceListGetInfo () 传递产品代码,并询问上次使用的源。据我所知,托管代码中没有任何 MS 供应。我仍然不清楚“在我的文件部署之后”是否仍然意味着安装期间或您的应用运行时的自定义操作。
    【解决方案3】:

    好的。我今天设法让它工作。

    我从我的 WIX 文件中传入了 CustomActionData

    <CustomAction Id="SetPathInst" Property="EnactorInstaller" Value="DataKey=[SourceDir];DataKeyInst=[INSTALLDIR]" />
    

    然后我可以在我的 Vb 中使用

       Dim srcPath As String = session.CustomActionData("DataKey")
       Dim srcPathInst As String = session.CustomActionData("DataKeyInst")
    

    我必须确保我的 CA 执行设置为延迟。我上面的示例允许我在一个自定义操作中传递多个属性值。然后,我还必须将此 CA 的属性设置为指向我的主 CA 的 ID,并将其设置为首先执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 2014-10-17
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多