WIX 自定义操作参数中的连接字符串

Posted

技术标签:

【中文标题】WIX 自定义操作参数中的连接字符串【英文标题】:Connection String in a WIX Custom Action Parameter 【发布时间】:2013-10-03 14:40:01 【问题描述】:

使用 WIX 3.7,我想将连接字符串传递给自定义操作。但是,由于连接字符串包含 ';'未正确解析自定义操作数据。

<CustomAction Id="PopulateActionPrep" Property="PopulateAction" Execute="immediate" Value="CONNECTIONSTRING=&quot;[CONNECTIONSTRING]&quot;;PRODUCTVERSION=[ProductVersion]" /> 

我尝试使用引号来转义连接字符串,但没有奏效。当我从 CustomActionData 读取 CONNECTIONSTRING 属性时,它会返回 "Data Source=SqlServerName

有没有办法在 WIX 中转义相等的分号?

【问题讨论】:

我会将连接字符串拆分为多个部分,将这些单独的部分传递给CustomActionData,然后让自定义操作从这部分“构建”连接字符串。一种解决方法。 【参考方案1】:

答案是是的,你使用;;逃脱;

/// <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;另见下方的UnescapeParse。)

可能更好的消息,您可以将数据作为原始字符串访问并完全控制其反序列化方式:

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;
    

https://github.com/wixtoolset/wix3/blob/wix311rtm/src/DTF/Libraries/WindowsInstaller/Session.cs#L859-L874

【讨论】:

【参考方案2】:

您没有说明延迟自定义操作是用什么语言编写的。使用设置属性自定义操作仅在有限的情况下有用。您通常所做的也是立即使用代码自定义操作。例如,如果我正在使用 C# DTF 自定义操作,我会编写一个自定义操作来创建一个 CustomActionData 类并用我的字典填充它。然后我会将其序列化为传递给延迟自定义操作的属性。

在延迟自定义操作中,我通过反序列化 CustomActionData 属性创建一个新的 CustomActionData 类,然后访问我的数据字典。

通过利用 CustomActionData 类,您不必发明自己的结构化和转义数据的方式。有关更核心的示例,请参阅我使用 JSON 的博客。

Beam Me Up: Using JSON to serialize CustomActionData

【讨论】:

以上是关于WIX 自定义操作参数中的连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

参数未传递给 WiX 中的延迟自定义操作

WiX 自定义操作以按钮开始

WiX - 带有安装和卸载(或回滚)参数的多个自定义操作

如何在关闭对话框的 Wix 安装程序中停止自定义操作中的进度条

向 WiX 安装程序添加自定义操作

验证 WIX 安装程序中的输入控件