t4 模板 多个输出/模板指令警告

t4 Templates Multiple output/templates directives warning

提问人:Shynord 提问时间:3/6/2023 最后编辑:Jason AllerShynord 更新时间:3/7/2023 访问量:72

问:

我目前正在研究一个由我没有联系的人开发的旧解决方案。

在解决方案中,使用了 T4 模板。老实说,我以前从未使用过这种模板。其中许多编译时带有有关模板和/或输出指令的警告:

  • 在模板中发现了多个输出指令。除第一个之外,所有内容都将被忽略。
  • 在模板中发现了多个模板指令。除第一个之外,所有内容都将被忽略。应在一个模板中指定模板指令的多个参数。

对于相同的文件,警告出现多次,并且每次都指示相同的行。但是,每个文件的警告显示的行都不同。

<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ output extension=".wxs" #>
<#@ assembly name="System.Core.dll" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Security.Cryptography" #> 
<#+
static string getGUID(string input,string sep="-")
    {
        MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
        byte[] inputBytes = Encoding.Default.GetBytes(input);
        byte[] hashBytes = provider.ComputeHash(inputBytes);

        //generate a guid from the hash:
        return (new Guid(hashBytes)).ToString().ToUpper().Replace("-",sep);

    }
#>

例如,此文件编译时有 6 条关于输出指令的警告,所有警告都指示第 5 行,即:<#@ import namespace="System.Text" #>

其他文件有相同的问题,指示不同的行,例如: 或者 这让我相信问题实际上并不来自这些行。<#@ assembly name="System.Core.dll" #><#@ output extension=".wxs" #>

每个文件都包含输出和模板目录。与警告相关的部分文件包含在其他 .tt 文件中。所以我认为没有必要在包含它们的文件中指示输出指令。因此,我试图删除它们,但这没有用。下面是一个包含上一个文件的 .tt 文件的示例:

<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core.dll" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Security.Cryptography" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ include file="WixDirectoryTree.tt" #>
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<#
TryAndGenerateDirectory(@"..\UserPrograms", "UserPrograms", @"$(var.SolutionDir)\UserPrograms\", "ProgramDataUserPrograms");
#>
</Wix>

我还尝试在仅包含指令行的文件中编写指令行,并将其从包含的文件中删除。 例:

<#@ assembly name="System.Core.dll" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Security.Cryptography" #> 
<#+
static string getGUID(string input,string sep="-")
    {
        MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
        byte[] inputBytes = Encoding.Default.GetBytes(input);
        byte[] hashBytes = provider.ComputeHash(inputBytes);

        //generate a guid from the hash:
        return (new Guid(hashBytes)).ToString().ToUpper().Replace("-",sep);

    }
#>

但这并不能阻止编译器指示完全相同的警告。

C# 可视化工作室-2022 T4

评论


答: 暂无答案