2009-11-03 5 views
8

単一のプロパティにセミコロンが含まれている場合、MSBuildはアイテムグループ内で使用するとプロパティをプロパティのリストに自動的に解析します。ここに私のプロジェクトからの抜粋です:タスクは、@(InstallShieldProperties)itemgroupを消費すると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> 

は、それがセミコロンが含まれているので、MSBuildのは、サブセットのプロパティのリストにConnectionStringプロパティを解析します。

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

私はアイテムグループの区切り文字を変更することができますが、違いはありません。 カスタムタスク内でstring []配列を操作しないようにしようとしています。

答えて

9

AFAICSは、あなたが$でセミコロンをエスケープするか(のConnectionString)プロパティのように:

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

または交換するためにいくつかのタスクを使用 ';' ConnectionStringプロパティを '%3B'に変更し、InstallShieldPropertiesアイテムのそのプロパティを使用します。

他の方法は、カスタムタスクのプロパティタイプをstring []からstringに変更してから、それを自分で分割することです。囲み引用符を使用して、Connection文字列部分を他のキーと値のペアから分離することができます。

カスタムタスクで意味がある場合、接続文字列は別のタスクプロパティとして持つための特別なプロパティです。

8

MSBuild 4.0では、Property Functionsがあります。これらの機能を使用すると、.NET Stringのインスタンスメソッドを、文字列であるかのようにプロパティで直接呼び出すことができます。あなたの例では

、代わりに使用する:

$(ConnectionString) 

あなたが使用することができます

文字列メソッドは、(置き換え呼び出します
$(ConnectionString.Replace(';', '%3B')) 

を)%3B

9

Inでセミコロンを交換しますMSBuild 4.0では、$([MSBuild]::Escape($(ConnectionString)))を使用できます。

+1

非常に便利です!そして[ここには、プロパティ関数のドキュメントへのリンクがあります](http://msdn.microsoft.com/en-us/library/dd633440.aspx)。 –

関連する問題