her*_*duk 13 .net c# t4 auto-generate .net-assembly
我有一个.tt脚本需要引用几个外部程序集.
T4主机是否可以自动包含项目中引用的程序集 - 而不是手动为每个程序集添加程序集指令?
例如,当使用相对于的路径时,从nuget引用程序集是一个移动目标$(ProjecDir)
.
使用汇编路径$(Project)\bin\Debug\Example.dll
似乎也不是最优的 - 因为它要求构建以前已经成功 - 如果你有.tt文件ErrorGeneratingOutput
在.cs文件中生成" ",情况可能不是这样!
更新1:
所以我对此进行了第二次尝试,但这次尝试解决围绕"TransformOnBuild"的问题(作为旁注,我强烈推荐@ kzu的优秀项目:https://github.com/clariuslabs/TransformOnBuild)而没有$(SolutionDir)在没有直接从msbuild运行TextTransform时可用.无论如何 - 我想出了一个两步解决方案.
msbuild目标使用WriteLinesToFile任务根据csproj文件中的引用生成一个.tt文件,其中包含一个新的程序集指令列表.
项目中的任何其他.tt文件都可以包含自动生成的文件以获取已注册的项目程序集.
以下是目标的示例:
<Target Name="Write_AssemblyRefs_TT" BeforeTargets="TransformOnBuild">
<!-- A message for all to enjoy! -->
<WriteLinesToFile File="@(MyTextFile)"
Lines="<# /* AUTOGENERATED BY MSBUILD and Kern Herskind Nightingale */ #>"
Overwrite="true"
Encoding="Unicode" />
<!-- Output all assembly references with a HintPath -->
<WriteLinesToFile File="@(MyTextFile)"
Lines="<#@ assembly name="$(ProjectDir)%(Reference.HintPath)" #>"
Overwrite="false"
Encoding="Unicode"
Condition="'%(Reference.HintPath)' != ''" />
<!-- Output all project references - this could fail with custom nameing/build output dirs -->
<WriteLinesToFile File="@(MyTextFile)"
Lines="<#@ assembly name="$(ProjectDir)%(ProjectReference.RelativeDir)bin\$(Configuration)\%(ProjectReference.Name).dll" #>"
Overwrite="false"
Encoding="Unicode" />
</Target>
<ItemGroup>
<MyTextFile Include="AssemblyRefs.tt" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
以及如何将其包含在T4文件中(平凡):
<#@ include file="AssemblyRefs.tt" #>
Run Code Online (Sandbox Code Playgroud)
代码生成器的代码生成:)
更新2:
我创建了一个Nuget包,以便于添加上面的汇编指令生成构建目标:https://www.nuget.org/packages/AssemblyReferencesTT/1.0.12
如果可以的话,我会在评论中发布此内容。
对于这个问题:不可能自动包含项目中引用的程序集,但您可以限制必须执行的工作。
如果您在建议 1 中看到以下链接,则可以在 t4 读取之前使用 C# 定义汇编代码。这使得可以通过反射读取目录并加载其中的每个程序集。所以问题是您的程序集将在哪里?
List<Assembly> allAssemblies = new List<Assembly>();
string path = Assembly.GetExecutingAssembly().Location;
foreach (string dll in Directory.GetFiles(path, "*.dll"))
allAssemblies.Add(Assembly.LoadFile(dll));
<#@ assembly name=dll #>
Run Code Online (Sandbox Code Playgroud)
这是未经测试的,但至少应该让你开始。供参考 ->如何从 /bin 目录中加载所有程序集
对于第二部分:
$(SolutionDir)
但这与 $(Project) 相同,只是低一级。->如何在 T4 文本模板中使用自定义库/项目?编辑:这是一个工作动态包括。只需在任何其他 .tt 文件中引用由此生成的 .ttinclude 结果
我用调试器测试了它,它似乎可以工作。
并将程序集本地化更改为您需要的位置。
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Net.Http" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".ttinclude" #><#
List<Assembly> allAssemblies = new List<Assembly>();
string file = Assembly.GetExecutingAssembly().Location;
if(file!= "")
{
string path = Path.GetDirectoryName(file).TrimEnd();
if(path != "")
foreach (string dll in Directory.GetFiles(path, "*.dll"))
{
if(dll != "")
{
allAssemblies.Add(Assembly.LoadFile(dll));
#>\<#<#= "@ assembly name=\""+ dll +"\" "#>\#><#="\n"#><#
}
}
}
#>
Run Code Online (Sandbox Code Playgroud)
输出:
<#@ assembly name="C:\TEMP\3mo0m0mq.dll" #>
<#@ assembly name="C:\TEMP\4ybsqre3.dll" #>
<#@ assembly name="C:\TEMP\ao0bzedf.dll" #>
<#@ assembly name="C:\TEMP\bo2w102t.dll" #>
<#@ assembly name="C:\TEMP\c5o2syvv.dll" #>
<#@ assembly name="C:\TEMP\dz1fin10.dll" #>
<#@ assembly name="C:\TEMP\giym0gef.dll" #>
<#@ assembly name="C:\TEMP\hjfgqkov.dll" #>
<#@ assembly name="C:\TEMP\ibuz4wvb.dll" #>
<#@ assembly name="C:\TEMP\ilrcwa2y.dll" #>
<#@ assembly name="C:\TEMP\k0yeumhb.dll" #>
<#@ assembly name="C:\TEMP\kirzdsqp.dll" #>
<#@ assembly name="C:\TEMP\ksxl4f2z.dll" #>
<#@ assembly name="C:\TEMP\l4kja4ts.dll" #>
<#@ assembly name="C:\TEMP\ljgxkpo0.dll" #>
<#@ assembly name="C:\TEMP\lkvkmlct.dll" #>
<#@ assembly name="C:\TEMP\lnofhhlq.dll" #>
<#@ assembly name="C:\TEMP\nbqhmjqd.dll" #>
<#@ assembly name="C:\TEMP\oc3pxhmq.dll" #>
<#@ assembly name="C:\TEMP\qb43ntcu.dll" #>
<#@ assembly name="C:\TEMP\qlyoyhyr.dll" #>
<#@ assembly name="C:\TEMP\snwvtb00.dll" #>
<#@ assembly name="C:\TEMP\umhhb2wb.dll" #>
<#@ assembly name="C:\TEMP\xsyfel0b.dll" #>
<#@ assembly name="C:\TEMP\z1weyhko.dll" #>
Run Code Online (Sandbox Code Playgroud)
您可以使用 \<# 来转义 <# 字符,请参阅此内容。
归档时间: |
|
查看次数: |
3189 次 |
最近记录: |