T4:在Visual Studio和MSBuild中使用属性

Bor*_*vic 5 .net t4 visual-studio-2012

我在创建T4模板时遇到问题,该模板可用于从Visual Studio和MSBUild生成相对简单的C#代码.模板引用DLL,该DLL驻留在项目的输出路径中.除此之外,它是一个相当简单的模板,循环遍历域对象的集合,并为每个域对象输出测试方法.

MSDN建议使用以下方法在两个主机中使用属性:

<!-- 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>
Run Code Online (Sandbox Code Playgroud)

不幸的是,这只是行不通.通过MSBuild执行时,我收到以下错误:

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

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

小智 1

我遇到了同样的问题,很抱歉我没有得到任何明显的修复。然而问题确实消失了,看起来像是一系列可能的问题。

我认为关键是这种类型的属性声明仅在您使用 MSBuild 构建解决方案/项目时才有效,如果您使用 Visual Studio,则属性将为 null。我认为这对我来说是一个困惑。最后,我最终在模板中进行了调用,我尝试获取 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 ;
}
Run Code Online (Sandbox Code Playgroud)

另一件需要注意的事情是使用字符串连接构建无效的字符串,很容易以空值结束