2014-05-09 31 views
5

我在创建可用于从Visual Studio和MSBUild生成相对简单的C#代码的T4模板时遇到困难。该模板引用驻留在项目输出路径中的DLL。除此之外,它是一个相当简单的模板,它通过一组域对象进行循环,并为它们中的每一个输出测试方法。T4:在Visual Studio和MSBuild中都使用属性

MSDN suggests在两个主机使用性能以下方法:

<!-- Define a project property, myLibFolder: --> 
<PropertyGroup> 
    <myLibFolder>$(MSBuildProjectDirectory)\..\libs</myLibFolder> 
</PropertyGroup> 

<!-- Tell the MSBuild T4 task to make the property available: --> 
<ItemGroup> 
    <T4ParameterValues Include="myLibFolder"> 
     <Value>$(myLibFolder)</Value> 
    </T4ParameterValues> 
    </ItemGroup> 

不幸的是,这是行不通的。当通过的MSBuild执行,我得到以下错误:

Compiling transformation: Metadata file '$(myLibFolder)Cmc.SpeedWays.Core.Testing.dll' could not be found 

有没有人设法解决这个问题,或者至少找到一个可接受的解决方法吗?我们使用VS2012和MSBUild 4.0。

回答

1

我有同样的问题,很抱歉地说,我没有得到一个明显的修复。然而问题确实消失了,它似乎是一系列可能的问题。

我认为关键之一是这种类型的财产声明只适用于如果您使用MSBuild构建解决方案/项目,如果您使用Visual Studio的属性将为空。我认为这是我的困惑。最后,我结束了在我的模板,来电,我试图让MSBuild的申报财产,如果失败作为VS

var configName = Host.ResolveParameterValue("-", "-", "configuration"); 
if (String.IsNullOrEmpty(configName)==true) 
{ 
    WriteLine ("// Generated from Visual Studio"); 
    IServiceProvider serviceProvider = (IServiceProvider)this.Host; 
    DTE dte = serviceProvider.GetService(typeof(DTE)) as DTE; 
    configName = dte.Solution.SolutionBuild.ActiveConfiguration.Name ; 
} 

其他的事情需要注意的是建筑用字符串连接无效的字符串,方便结束为空