构建期间生成T4代码,自定义程序集引用

时间:2012-10-30 18:54:25

标签: .net msbuild t4

我有一个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   (86)\的MSBuild \微软\ VisualStudio的\ TextTemplating \ V10.0 \ Microsoft.TextTemplating.targets   (407):主持人在尝试解决问题时抛出异常   程序集引用'$(TargetDir)\ MyDependency.dll'。转型   不会运行。抛出以下异常:   System.IO.FileLoadException:给定的程序集名称或代码库是   无效。 (来自HRESULT的异常:0x80131047)at   System.Reflection.AssemblyName.nInit(RuntimeAssembly&amp; assembly,   Boolean forIntrospection,Boolean raiseResolveEvent)at   System.Reflection.AssemblyName.nInit()at   Microsoft.VisualStudio.TextTemplating.GlobalAssemblyCacheHelper.GetLocation(字符串   strongName)at   Microsoft.VisualStudio.TextTemplating.Sdk.Host.GenericTextTemplatingHost.ResolveAssemblyReference(字符串   assemblyReference)at   Microsoft.VisualStudio.TextTemplating.Engine.ResolveAssemblyReferences(ITextTemplatingEngineHost   host,TemplateProcessingSession session)。 Line = -1,Column = -1

显然,它无法解决团队构建环境中的$(TargetDir)

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

我不想使用环境变量。

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

1 个答案:

答案 0 :(得分:4)

我没有看到visual studio定义$(OutputPath)的位置。你在项目中的项目中尝试过$(TargetDir)吗?然后你可以从T4文件中的Assembly声明中删除$(TargetDir)\。

我只是通过一系列可能来获得类似工作的东西,今天或明天都会做一篇博客文章。

所以:

<ItemGroup>
    <T4ReferencePath Include="$(TargetDir)" />
</ItemGroup>
你的csproj中的

<#@ assembly name="MyDependency.dll" #>
在您的T4文件中

相关问题