2012-03-13 8 views
2
の後にリセットする

コンパイル時に使用されるロケール/カルチャをXNAコンテンツパイプラインプロジェクトに変更し、コンパイルが終了した後で元に戻すタスクを実行しようとしています。意図は、英語以外のマシンでの浮動小数点数の適切な解析を可能にすることです。CultureInfoをコンパイルする前に設定し、常に

これまでのところ私はこのようBeforeBuildとAfterBuildを使用しています:

<UsingTask TaskName="PressPlay.FFWD.BuildTasks.SetLocale" AssemblyFile="PressPlay.FFWD.BuildTasks.dll" /> 
<Target Name="BeforeBuild"> 
    <SetLocale> <!-- By default, set to 'en-US' --> 
    <Output TaskParameter="PrevLocale" ItemName="OrigLocale" /> 
    </SetLocale> 
</Target> 
<Target Name="AfterBuild"> 
    <SetLocale Locale="@(OrigLocale)" /> 
</Target> 

それは、ロケールがリセットされませんその後、エラーがコンパイル(無効なXMLまたはContentSerializerエラー)の間に発生した場合を除き、正常に動作します。 AfterBuild always executes(私の場合ではない)とビルド後にno way to ensure a target is always ranがあると言う人がいるので、SOの回答は矛盾しています。私はこの周りのGoogleに関する正確な情報を見つけていない。

私はPostBuildEventを使用して、それが常に実行するように設定するオプションがあります知っているが、それはコマンドを実行するためにExecを使用したいと私はそれがその目的を破って、別のスレッドで実行します容疑者は(私は変更するCurrentThread.CultureInfoを設定しましたロケール)。

したがって、ターゲットが常に実行されていることを確認する方法はありますか?あるいは、VS2010に特定のカルチャーでコンパイルを実行するよう指示する他の方法はありますか?

問題を明示的に明確にするドキュメントへのリンクは非常に高く評価されます。

- セヴァの答え、次の最終的な解決策、 -

XNAのコンテンツパイプラインはPreBuildEventPostBuildEventを宣言しません。他の必要な特性(RunPostBuildEventPreBuildEventDependsOnPostBuildEventDependsOn)のいずれかで、定義されていません。ただし、それらを定義すると、他のプロジェクトと同様にコンテンツパイプラインがうまく活用されます。

だから、私はcontentcsprojファイルにしなければならなかった変更内容は以下の通りであった。別のプロジェクトがBeforeBuildかを再定義した場合に発生する可能性のある潜在的な問題を別の問題は、間接的に世話をされ、この溶液で

<!-- Added to ensure the locale is always restored --> 
<PropertyGroup> 
    <RunPostBuildEvent>Always</RunPostBuildEvent> 
</PropertyGroup> 

<!-- Reference includes, project references and other stuff --> 
<!-- ... --> 
<Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\$(XnaFrameworkVersion)\Microsoft.Xna.GameStudio.ContentPipeline.targets" /> 

<!-- Customizations to change locale before compilation and restore it after --> 
<!-- Needed to properly treat dots in the XMLs as decimal separators --> 
<UsingTask TaskName="PressPlay.FFWD.BuildTasks.SetLocale" AssemblyFile="PressPlay.FFWD.BuildTasks.dll" /> 
<!-- Apparently ContentPipeline.targets does not define PreBuildEvent and PostBuildEvent --> 
<!-- However, they are still used if defined --> 
<Target Name="PreBuildEvent" DependsOnTargets="$(PreBuildEventDependsOn)"/> 
<Target Name="PostBuildEvent" DependsOnTargets="$(PostBuildEventDependsOn)"/> 
<PropertyGroup> 
    <PreBuildEventDependsOn> 
    $(PreBuildEventDependsOn); 
    EstablishUSLocale 
    </PreBuildEventDependsOn> 
</PropertyGroup> 
<PropertyGroup> 
    <PostBuildEventDependsOn> 
    $(PostBuildEventDependsOn); 
    RestoreOriginalLocale 
    </PostBuildEventDependsOn> 
</PropertyGroup> 

<Target Name="EstablishUSLocale"> 
    <SetLocale Locale="en-US"> 
    <Output TaskParameter="PrevLocale" ItemName="OrigLocale" /> 
    </SetLocale> 
</Target> 

<Target Name="RestoreOriginalLocale"> 
    <SetLocale Locale="@(OrigLocale)" /> 
</Target> 

AfterBuildを使用して、一方の定義が他方の定義をオーバーライドします。

答えて

0

PostBuildEventは、ビルド後に常に実行するように設定できるため、使用できます。しかし、あなたが正しく気づいたように、ここではExecタスクを使用することはできません。しかし、PostBuildEventは実際には$(PostBuildEventDependsOn)というプロパティを通して拡張可能です。あなたは、このプロパティを定義する必要があります:

<PropertyGroup> 
    <PostBuildEventDependsOn>RestoreOriginalLocale</PostBuildEventDependsOn> 
</PropertyGroup> 

ターゲットRestoreOriginalLocaleはあなたAfterBuildターゲットに持っていたものです:あなたのBeforeBuildターゲットがまだ必要とされている

<Target Name="RestoreOriginalLocale"> 
    <SetLocale Locale="@(OrigLocale)" /> 
</Target> 

、それはあなたがあなたの質問に書いたものとして残っています。

PostBuildEventが失敗したときに実行されるように(したがってRestoreOriginalLocaleの実行が必要)、プロパティRunPostBuildEventをAlwaysに設定する必要があります。 IDEを使用するか、.csprojファイルを手動で編集することで実行できます。

+0

このソリューションは完全に機能しましたが、XNAのコンテンツパイプラインで動作するようにこのソリューションを適応させなければなりませんでした。質問の最終的な解決策については、少しのコードが含まれているので、詳しく説明します。 – Elideb

関連する問題