Kos*_*sta 6 c# t4 assemblies visual-studio-2010
我想获得一个T4模板所在项目的汇编参考.我知道我可以获得项目的路径,例如Host.ResolveAssemblyReference("$(ProjectDir)")
,我可以添加,bin\\debug\\{projectName}.dll
因为我的程序集名称是由项目名称命名的,但情况并非总是如此,我正在创建可重用的模板,所以我需要路径到dll或最优选的是Assembly
实例.我也找到了如何在方法中引用这里Project
所解释的,但那又是什么?GetProjectContainingT4File
有办法搞定吗?
顺便说一句,我需要这个参考来访问特定类型并从中生成一些代码.
小智 11
遵循简单的代码(VS 2013):
var path = this.Host.ResolveAssemblyReference("$(TargetPath)");
var asm = Assembly.LoadFrom(path);
Run Code Online (Sandbox Code Playgroud)
您还可以$(...)
在项目psot构建步骤编辑器中找到属性.
好吧,我设法得到所需的汇编@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;
}
#>
Run Code Online (Sandbox Code Playgroud)
因此,要找到组装我不得不参照项目对路GetProject()
的方法,然后使用项目的属性OutputFileName
用prj.Properties.Item("OutputFileName").Value
.由于我找不到属性项目的任何地方,我使用枚举和循环来检查Properties
集合,然后找到我需要的东西.这是一个循环代码:
<#
// ....
foreach(Property prop in prj.Properties)
{
#>
<#= prop.Name #>
<#
}
// ....
#>
Run Code Online (Sandbox Code Playgroud)
我希望这会对某人有所帮助.
归档时间: |
|
查看次数: |
3178 次 |
最近记录: |