8

当单个属性包含分号时,在项目组中使用时,MSBuild 会自动将该属性解析为属性列表。这是我项目的一个片段:

 <PropertyGroup>
   <ConnectionString>workstation id=.;packet size=4096;Integrated Security=SSPI;data source=.;initial catalog=$(SqlDbName)</ConnectionString>
 </PropertyGroup>

 <ItemGroup>
   <InstallShieldProperties Include="
       CONNECTIONSTRING=$(ConnectionString);
       Another=$(value)"/>
 </ItemGroup> 

当任务使用 @(InstallShieldProperties) 项目组时,MSBuild 会将 ConnectionString 属性解析为子集属性列表,因为它包含分号。

    foreach (string property in Properties)
    {
      // Properties array parsed to pieces
    }

我知道我可以更改项目组的分隔符,但这不会有任何区别。我试图避免在自定义任务中操作 string[] 数组。

4

3 回答 3

11

在 MSBuild 4.0 中,您可以使用$([MSBuild]::Escape($(ConnectionString))).

于 2010-12-07T20:41:26.077 回答
9

AFAICS,您可以转义 $(ConnectionString) 属性中的分号,例如:

<ConnectionString>workstation id=.%3Bpacket size=4096%3B.."</ConnectionString>

或者使用一些任务来替换';' 在 ConnectionString 属性中添加到“%3B”,然后在 InstallShieldProperties 项中使用该属性。

另一种方法可能是将自定义任务中的属性类型从 string[] 更改为 string,然后按照您想要的方式自行拆分。您可以使用封闭引号将连接字符串部分与其他键/值对分开。

或者,如果它对您的自定义任务有意义,那么连接字符串可能是一个足够特殊的属性,可以作为单独的任务属性。

于 2009-11-03T07:58:48.283 回答
9

在 MSBuild 4.0 中,现在有Property Functions。这些允许您做的一件事是直接在您的属性上调用 .NET String 实例方法,就好像它们是字符串(它们是)一样。

在您的示例中,而不是使用:

$(ConnectionString)

你可以使用:

$(ConnectionString.Replace(';', '%3B'))

它将调用 String 方法 Replace() 用 %3B 替换分号

于 2010-09-10T06:34:59.777 回答