使用WIX 3.7,我想将连接字符串传递给自定义操作。但是,由于连接字符串包含';'自定义操作数据未正确解析。
<CustomAction Id="PopulateActionPrep" Property="PopulateAction" Execute="immediate" Value="CONNECTIONSTRING="[CONNECTIONSTRING]";PRODUCTVERSION=[ProductVersion]" />
我尝试使用引号来转义连接字符串,但这不起作用。当我从CustomActionData读取 CONNECTIONSTRING 属性时,它返回“Data Source = SqlServerName 。
有没有办法逃避WIX中的等分号?
答案 0 :(得分:2)
答案是是,您使用;
转义;;
:
/// <summary>
/// Escapes a value string by doubling any data-separator (semicolon) characters.
/// </summary>
/// <param name="value"></param>
/// <returns>Escaped value string</returns>
private static string Escape(string value)
{
value = value.Replace(String.Empty + CustomActionData.DataSeparator, String.Empty + CustomActionData.DataSeparator + CustomActionData.DataSeparator);
return value;
}
(https://github.com/wixtoolset/wix3/blob/wix311rtm/src/DTF/Libraries/WindowsInstaller/customactiondata.cs#L391-L400;另请参见下面的Unescape
和Parse
。)
潜在的更好的消息,您可以将数据作为原始字符串访问,并完全控制其反序列化方式:
var rawString = session["CustomActionData"];
这就是Session.CustomActionData
正在做的所有事情:
/// <summary>
/// Gets custom action data for the session that was supplied by the caller.
/// </summary>
/// <seealso cref="DoAction(string,CustomActionData)"/>
public CustomActionData CustomActionData
{
get
{
if (this.customActionData == null)
{
this.customActionData = new CustomActionData(this[CustomActionData.PropertyName]);
}
return this.customActionData;
}
}
答案 1 :(得分:0)
您没有说出延迟自定义操作所使用的语言。使用set属性自定义操作仅在有限的情况下有用。您通常所做的是立即使用代码自定义操作。例如,如果我使用C#DTF自定义操作,我会编写一个自定义操作,创建一个CustomActionData类并用我的字典填充它。然后我将它序列化为传递给延迟自定义操作的属性。
在延迟自定义操作中,我通过反序列化CustomActionData属性创建一个新的CustomActionData类,然后访问我的数据的字典。
通过利用CustomActionData类,您可以避免发明自己的构造和转义数据的方式。有关更难的核心示例,请参阅我使用JSON的博客。