生成过程中的T4代码,自定义程序集引用

10

我有一个T4模板,它会处理我项目中的几个.tt文件。我还定义了一些自定义类来帮助代码转换过程。

<#@ template language="C#"  hostspecific="True" debug="True" #>
<#@ output extension="cs" #>
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="$(TargetDir)\MyDependency.dll" #> 

这在Visual Studio中有效,我有一个VS宏定义了 $(TargetDir) 的正确值。

现在,我想在构建过程中执行代码生成过程。我添加了:

<TransformOnBuild>true</TransformOnBuild>
<OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
<IncludeDslT4Settings>true</IncludeDslT4Settings> <ItemGroup>
<T4ReferencePath Include="$(OutputPath)" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" /> 

我的构建可以运行,但是出现以下错误:

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets (407): 尝试解析程序集引用“$(TargetDir)\MyDependency.dll”时,宿主引发异常。转换将不会运行。引发以下异常: System.IO.FileLoadException: 给定的程序集名称或代码库无效。(HRESULT 的异常:0x80131047) at System.Reflection.AssemblyName.nInit(RuntimeAssembly& assembly, Boolean forIntrospection, Boolean raiseResolveEvent) at System.Reflection.AssemblyName.nInit() at Microsoft.VisualStudio.TextTemplating.GlobalAssemblyCacheHelper.GetLocation(String strongName) at Microsoft.VisualStudio.TextTemplating.Sdk.Host.GenericTextTemplatingHost.ResolveAssemblyReference(String assemblyReference) at Microsoft.VisualStudio.TextTemplating.Engine.ResolveAssemblyReferences(ITextTemplatingEngineHost host, TemplateProcessingSession session). 行=-1, 列=-1

显然在 Team build 上下文中无法解析 $(TargetDir)

我尝试将 TargetDir 添加到我的构建配置属性组,但没有成功。该值未能传递到 T4 代码生成器的上下文中。

我不想使用环境变量。

如何在 Team Build 上下文中正确设置 $(TargetDir)


Oleg Sych写了关于msbuild集成的文章: http://www.olegsych.com/2010/04/understanding-t4-msbuild-integration/#IncludeFolders。我不能确定它是否解决了你的问题,但它似乎是这个话题的一个相当好的指南。 - Just another metaprogrammer
1个回答

5

我没有在Visual Studio中找到$(OutputPath)的定义。您是否尝试在项目中使用$(TargetDir)?然后,您可以从T4文件中的程序集声明中删除$(TargetDir)\。

我刚刚通过大量尝试来实现类似的功能,今天或明天将会发布一篇博客文章。

因此:

<ItemGroup>
    <T4ReferencePath Include="$(TargetDir)" />
</ItemGroup>

在您的 csproj 中,以及
<#@ assembly name="MyDependency.dll" #>

在您的T4文件中

这是之前承诺的博客文章。对于延迟我深表歉意!http://netitude.bc3tech.net/2013/06/15/t4-gotchyas-in-your-environment/ - bc3tech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接