9

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

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

这适用于 Visual Studio,我有一个正确定义 $(TargetDir) 的 VS 宏。

现在,我想在构建过程中执行代码生成过程。我补充说:

<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)在 System.Reflection.AssemblyName.nInit(RuntimeAssembly& 程序集,Boolean forIntrospection,Boolean raiseResolveEvent)在 System.Reflection.AssemblyName.nInit() 在 Microsoft.VisualStudio.TextTemplating.GlobalAssemblyCacheHelper.GetLocation(String strongName) 在Microsoft.VisualStudio.TextTemplating.Sdk.Host.GenericTextTemplatingHost。Microsoft.VisualStudio.TextTemplating.Engine.ResolveAssemblyReferences(ITextTemplatingEngineHost 主机,TemplateProcessingSession 会话)上的 ResolveAssemblyReference(字符串 assemblyReference)。行=-1,列=-1

显然它不会$(TargetDir)在团队构建上下文中解决。

我尝试将 TargetDir 添加到我的构建配置的属性组中,但无济于事。此值不会传递到 T4 代码生成器的上下文。

我不想使用环境变量。

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

4

1 回答 1

5

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

我刚刚通过一系列可能的工作来获得与工作类似的东西,今天或明天将发表一篇博文。

所以:

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

在你的 csproj 中,和

<#@ assembly name="MyDependency.dll" #>

在您的 T4 文件中

于 2013-06-12T17:07:25.993 回答