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)
另一件需要注意的事情是使用字符串连接构建无效的字符串,很容易以空值结束