运行T4模板时确定解决方案配置(调试/发布),以便将程序集包含在解决方案中。

4
我试图让我的T4模板以实用的方式引用我的解决方案中的程序集,这样当我在调试和发布之间更改配置时,它将包括来自我的解决方案的正确程序集。
我尝试了以下方法:
<#
    // Figured out how to get the current Configuration
    var serviceProvider = Host as IServiceProvider;
    var dte = serviceProvider.GetService(typeof(DTE)) as DTE;
    string ConfigName = dte.Solution.SolutionBuild.ActiveConfiguration.Name;

    // I have verified that I am getting the strings "Debug", and "Release"
    if (configName == "Debug") { 
#>
    <#@ include file="template.Debug.tt" #>
<# } else { #>
    <#@ include file="template.Release.tt" #>
<# } #>

template.Debug.tt文件长这样:

<#@ Assembly 
name="$(SolutionDir)TestProject.Core/bin/Debug/TestProject.Core.dll"#>

而template.Release.tt文件看起来像这样:

<#@ Assembly 
name="$(SolutionDir)TestProject.Core/bin/Release/TestProject.Core.dll"#>

当我尝试运行主T4时,遇到以下错误:
错误1 编译转换:已导入同一简单名称的程序集'TestProject.Core',版本=1.0.0.0,文化=中立,公钥令牌=null。请尝试删除其中一个引用或对它们进行签名以启用并行。
我猜处理器会处理程序集包含行,因为它沿着两个执行路径同时发生,这导致引用了两个程序集。
也尝试过这个:
<#@ Assembly 
name="$(SolutionDir)TestProject.Core/bin/$(Configuration)/TestProject.Core.dll"#>

有没有一种方法可以添加 $(Configuration)?这似乎是最合乎逻辑的选择。

其他人似乎只是在路径中硬编码 Debug。

引用错误的 DLL 并不知道这一点在调试时非常恼人,当发布代码到生产环境时,它也不会帮助事情顺利进行。

1个回答

0

一个想法是,您的T4支持dll可以被视为构建环境的一部分,因此Debug / Relase不适用。

对于支持dll的更改构建路径,使所有配置都转到例如$(SolutionDir)\BuildArtifacts,并在T4文件中引用该位置。

希望这有所帮助

附言。 我所做的(尽管我知道我是少数派)是出于这些原因避免使用T4支持dll,而只是将所有内容编写为T4“脚本”。


你让我思考了我想要这个dll的原因,我想现在我只需在需要的模板中复制代码。在有更好的解决方案出现之前,我会接受这个答案。 - jSnake04
有一些方法可以通过使用 // <#+ 作为注释来使 C# 代码可包含。这使得 C# 代码既可编译又可包含。如果您想了解更多细节,请询问。 - Just another metaprogrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接