我在创建 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/