我正在为我的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
答案 0 :(得分:0)
您是否考虑过使用WixUtilExtension提供的XMLConfig Element和XMLFile 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,并将其设置为首先执行。