2011-02-10 18 views
16

Visual Studio 2010でT4を使用していますが、私のソリューションでファイルを繰り返し処理したいのですが、T4ソース生成が一種のサンドボックスで動作し、現在の作業ディレクトリは、プログラムファイル内のVisual Studio 10ディレクトリ内にあります。T4ソリューションの現在の作業ディレクトリを取得する

T4ファイルが相対論的に参照される方法はありますか?ビルドを壊さないようにするか、同じファイル構造を持たない他のボックスで動作しますか?

おかげ

答えて

26

あなたがそうのようにtrueにhostspecific属性を設定する必要があります。

<#@ template language="C#" hostspecific="True" #> 

ITextTemplatingEngineHostインタフェースはあなたが必要な情報を提供します。

<#= this.Host.ResolveParameterValue("-", "-", "projects") #> 

私は解決策を参照する方法があるとは思わないが、あなたはあなたの*.ttファイルがあるパスを取得し、そこから他のファイルを取得することができます。

テキストテンプレートに対する位置からファイルをロードするには、あなたがこれを使用することができます:

this.Host.ResolvePath("relative/path.txt") 
+2

ありがとうございました!私はthis.Host.TemplateFileを使用して終了しました。テンプレートはテンプレートを直接指し示し、そこから実行されました。 – aceinthehole

+0

@aceinthehole、フィードバックありがとう! –

+2

DTEを読み込むことで、直接ソリューションを入手できます。http://stackoverflow.com/questions/12952110/accessing-projects-via-d------)-template –

9

これは私が解決策のベースディレクトリを取得するために使用する方法である:

public string GetSolutionDirectory() 
{ 
    var serviceProvider = this.Host as IServiceProvider; 
    var dte = serviceProvider.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; 
    return System.IO.Path.GetDirectoryName(dte.Solution.FullName); 
} 
4

ここですXMLファイルを作成するT4テンプレートで提供されるロジックJCallicoを使用する方法:

XML att ribute "filePath"は、Visual Studioのソリューションディレクトリに "\ MySubfolder \ MyFile.exe"を加えたものと等しくなります。

関連する問題