2012-12-20 13 views
6

T4テンプレートがあるプロジェクトのアセンブリへの参照を取得したいと思います。例えばHost.ResolveAssemblyReference("$(ProjectDir)")のようなプロジェクトへのパスを得ることができ、アセンブリ名にプロジェクト名が付けられているので、bin\\debug\\{projectName}.dllを追加することもできますが、必ずしもそうではなく、再利用可能なテンプレートを作成しています。 dllまたはもっとも好ましくはAssemblyインスタンスである。 私はまた、方法GetProjectContainingT4Fileの中でhereと説明されているように、Projectへの参照を得る方法を見つけました。T4テンプレートVS2010ホストアセンブリを取得

入手方法はありますか?

ところで、特定のタイプにアクセスしてそれらからいくつかのコードを生成するには、その参照が必要です。

+0

1つの可能性は、.csprojファイルを見つけて解析し、ビルド出力パスを抽出することです。これはxmlファイルです。 – FuleSnabel

+0

hm ...はい、私はおそらく、良い点。私が試してみます。 – Kosta

答えて

9

私は彼の提案を使用しませんでしたが、私は@FuleSnabelが私にヒントを与えたアセンブリへの必要な参照を得ることができました。

は、ここに私のT4テンプレートの一部です:

<#@ template debug="true" hostSpecific="true" #> 
<#@ output extension=".output" #> 
<#@ Assembly Name="System.Core.dll" #> 
<#@ Assembly Name="System.Windows.Forms.dll" #> 
<#@ Assembly Name="System.Xml.Linq.dll" #> 
<#@ Assembly Name="Microsoft.VisualStudio.Shell.Interop.8.0" #> 
<#@ Assembly Name="EnvDTE" #> 
<#@ Assembly Name="EnvDTE80" #> 
<#@ Assembly Name="VSLangProj" #> 

<#@ import namespace="System" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Diagnostics" #> 
<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Xml.Linq" #> 
<#@ import namespace="System.Collections" #> 
<#@ import namespace="System.Reflection" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #> 
<#@ import namespace="Microsoft.VisualStudio.Shell.Interop" #> 
<#@ import namespace="EnvDTE" #> 
<#@ import namespace="EnvDTE80" #> 
<#@ include file="T4Toolbox.tt" #> 
<# 
    Project prj = GetProject(); 
    string fileName = "$(ProjectDir)bin\\debug\\" + prj.Properties.Item("OutputFileName").Value; 
    string path = Host.ResolveAssemblyReference(fileName); 
    Assembly asm = Assembly.LoadFrom(path); 

    // .... 
#> 

// generated code goes here 

<#+ 
    Project GetProject() 
    { 
     var serviceProvider = Host as IServiceProvider; 
     if (serviceProvider == null) 
     { 
      throw new Exception("Visual Studio host not found!"); 
     } 

     DTE dte = serviceProvider.GetService(typeof(SDTE)) as DTE; 

     if (dte == null) 
     { 
      throw new Exception("Visual Studio host not found!"); 
     } 

     ProjectItem projectItem = dte.Solution.FindProjectItem(Host.TemplateFile); 
     if (projectItem.Document == null) { 
      projectItem.Open(Constants.vsViewKindCode); 
     } 

     return projectItem.ContainingProject; 
    } 
#> 

だから、私はGetProject()方法でプロジェクトへの参照を取得し、その後prj.Properties.Item("OutputFileName").Valueで、プロジェクトのプロパティOutputFileNameを使用していたアセンブリへの正しい道を見つけること。プロジェクトのプロパティはどこにも見つかりませんでしたので、列挙とループを使用してPropertiesコレクションを調べ、必要なものを見つけました。ここにループコードがあります:

<# 
// .... 
foreach(Property prop in prj.Properties) 
{ 
    #> 
    <#= prop.Name #> 
    <# 
} 
// .... 
#> 

私はこれが誰かを助けることを望みます。簡単なコードに続いて

+0

ありがとうございます。これはちょうど道路の始まりにちょっとした衝撃の上に私を押し込んだ。 – TeaDrivenDev

9

は(VS 2013)私の仕事:

var path = this.Host.ResolveAssemblyReference("$(TargetPath)"); 
var asm = Assembly.LoadFrom(path); 

また、あなたがプロジェクトpsotで$(...)プロパティは、手順エディタを構築見つけることができます。

+0

欲しい私はこれを倍増させることができます。ありがとう! – Mitch

関連する問題