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

标签 .net visual-studio-2012 t4

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

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。

最佳答案

我遇到了同样的问题,很遗憾地说我没有得到一个明显的解决方案。然而问题确实消失了,这似乎是一系列可能的问题。

我认为关键是这种类型的属性声明仅在您使用 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 ;
}

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

关于.net - T4:在 Visual Studio 和 MSBuild 中使用属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23569141/

相关文章:

c# - C# 中的 Int32 与 Int64 与 Int

c++ - 在 Visual Studio 2012 中执行完 C++ 程序后,内存泄漏是否仍然存在?

c++ - Visual Studio 2012 构建挂起

c# - 如何将变量的值添加到 asp :ListItem in a asp:RadioButtonList

c# - ServiceController.Stop() 后服务未完全停止

.net - 在 .NET 中使用 BouncyCaSTLe 进行签名并在 NodeJS 中进行验证

c# - Visual Studio 2012 给出了荒谬的错误

c# - T4MVC 扰乱了我的覆盖范围

ef-code-first - 用于生成 Code First MetaData 伙伴类的 T4 模板

TFS 托管构建 Controller - 未找到 Microsoft.TextTemplate.targets