CustomAction DLL Wix读取XML VB 2012

时间:2014-04-17 08:21:43

标签: xml vb.net dll wix

我正在为我的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

3 个答案:

答案 0 :(得分:0)

您是否考虑过使用WixUtilExtension提供的XMLConfig ElementXMLFile Element来做同样的事情?看看吧。

答案 1 :(得分:0)

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

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

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

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

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

答案 2 :(得分:0)

确定。我今天设法让这个工作。

我从我的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,并将其设置为首先执行。