2011-04-07 6 views
22

フラグに基づいて最適化されたコンテンツまたは標準コンテンツを出力できるT4テンプレートがあります。現在、私は自分のニーズに基づいてフラグを手動で変更しています。T4テンプレートを実行するときに解決策の設定(デバッグ/リリース)を決定する

私がしたいのは、Visual Studioのソリューション構成に基づいてフラグを設定することです。デバッグモードでビルドするように設定されている場合は、標準のコンテンツを出力します。リリースモードでビルドするように設定されている場合は、代わりにコンテンツを最適化します。私は、アセンブリディレクティブで$(SolutionDir)を使用することができますので

<#@ template language="C#" hostspecific="True" 
    compilerOptions="/d:$(ConfigurationName)" #> 

:私の場合、私は、次のような何かをしたい、しかしT4 Text Template - Is it possible to get compilation symbols from host?

:私は有望に見える別のT4の質問を見つけた

<#@ assembly name="$(SolutionDir)\myreference.dll" #> 

私は/ D思うだろう:$(ConfigurationName)私は行くために必要な場所に私になるだろう、と、私は私のフラグを設定するには、次の操作を行うことができます:

<# 
#if Debug 
optimize = false; 
#else 
optimize = true; 
#endif 
#> 

ああ、これはうまくいかないようです。私はまた、使用しようとしました:

Host.ResolveParameterValue("-", "-", "ConfigurationName"); 

また役に立たない。何か案は?

答えて

22

すぐに私は尋ねますが、this MSDN articleの一番下にあるスニペットを見つけて、私が必要な場所に移動します。ここでの答えは、IServiceProviderインターフェイスを使用してVisual Studio DTEを取得することです。ここでは、(ハードコードされた「デバッグ」を事前に謝罪)で行わなっているコードは次のとおりです。

var serviceProvider = Host as IServiceProvider; 
var dte = serviceProvider.GetService(typeof(DTE)) as DTE; 
var configName = dte.Solution.SolutionBuild.ActiveConfiguration.Name ; 
optimize = (configName != "Debug"); 

UPDATE

このコードは、アクティブなプロジェクトの現在の構成が変わっ最適化を持っているかどうかをチェックしますに。それはまだハードコードされたプロパティ名を持っていますが、変更する可能性ははるかに低いです。また、プロジェクトの最適化フラグを使用すると、私のシナリオのために多くの意味になります(私は自分のコードで最適化をオンにするかどうかを決定しようとしている):人々のために

var serviceProvider = Host as IServiceProvider; 
var dte = serviceProvider.GetService(typeof(EnvDTE.DTE)) as DTE; 
config = dte.Solution 
      .FindProjectItem(Host.TemplateFile) 
      .ContainingProject 
      .ConfigurationManager 
      .ActiveConfiguration; 
foreach(Property prop in config.Properties){ 
    if (prop.Name == "Optimize"){ 
     optimize = (bool)prop.Value; 
     break; 
    } 
} 
+0

MSDNドキュメントにDTEクラスのページはありますか?私はそれを探していて見つけにくいです。 – rstackhouse

+0

Nevermind。私はちょうどそれを見つけたと思う:http://msdn.microsoft.com/en-us/library/vstudio/EnvDTE(v=vs.100).aspx – rstackhouse

+0

SDTE?それはタイプミスですか? –

9

は、(デザイン時にこの作業を取得しようとしていますファイル保存)とat build-time(F5/F6)の2つの方法が必要です。

Emilは設計時の方法について説明しています。ビルド時のために、あなたは最初にあなたのプロジェクトファイルにT4パラメータを指定する必要があります。

<ItemGroup> 
    <T4ParameterValues Include="BuildConfiguration"> 
    <Value>$(Configuration)</Value> 
    <Visible>false</Visible>  
    </T4ParameterValues> 
</ItemGroup> 

次に、あなたがあなたの.ttの上部にそれを参照する必要があります。その後、

<#@ parameter type="System.String" name="BuildConfiguration" #> 

そして探しそれらのいずれかを提供することを起こる:あなたがあなたのテンプレートは両方のシナリオで作業したい場合は、両方のためのロジックを含める必要がある

string configurationName = Host.ResolveParameterValue("-", "-", "BuildConfiguration"); 
if (string.IsNullOrWhiteSpace(configurationName)) 
{ 
    var serviceProvider = (IServiceProvider)Host; 
    var dte = (DTE)serviceProvider.GetService(typeof(DTE)); 
    configurationName = dte.Solution.SolutionBuild.ActiveConfiguration.Name; 
} 

。デザインタイムメソッドはビルド時には機能しません(DTEホストはソリューションを提供するためのものではありません)。また、ビルド時メソッドは設計時には機能しません(MSBuildはパラメータを提供しません)。

関連する問題