包含此页的版本:
不含此页的版本:
可以向项目添加其他文件,供 Roslyn 分析器或源生成器使用。如果文件扩展名为 .additional文件,并且位于Assets文件夹或其子文件夹之一。
要传递到编译管道,必须根据格式命名文件Filename.[Analyzer Name].additionalfile.缺少[Analyzer Name]组件被导入,但未传递到编译管道。这[Analyzer Name]组件区分大小写,并且必须与其他文件目标的分析器名称匹配。这Filename组件不得包含句点 (.) 字符。
每个编译的程序集都会根据为该程序集定义运行的分析器接收一个附加文件列表,并按[Analyzer Name].例如,考虑一个具有以下程序集和分析器的项目:
Analyzer1
Analyzer2
Analyzer1和Analyzer2
如果项目包含四个名为FileA.Analyzer1.additionalfile,FileB.Analyzer2.additionalfile,FileC.additionalfile和FileD.Analyzer3.additionalfile,则 Unity 将传递以下附加文件列表以及相应的程序集:
FileA.Analyzer1.additionalfile
FileB.Analyzer2.additionalfile
FileA.Analyzer1.additionalfile,FileB.Analyzer2.additionalfile
因为FileC没有[Analyzer Name]组件和FileD引用项目中不存在的分析器,Unity 不会将任何一个分析器传递给编译管道。
分析器可以从分析器上下文中检索已编译程序集中包含的其他文件的完整列表。此列表包含程序集中包含的所有附加文件,而不仅仅是与当前分析器名称匹配的文件。以下示例演示了这一点:
using System.IO;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace SourceGeneratorTest1;
[Generator]
public class SG2 : ISourceGenerator
{
public void Execute(GeneratorExecutionContext context)
{
var pathOfFileWithTypeName = context.AdditionalFiles.FirstOrDefault(file => file.Path.Contains("GenerateType.SourceGenerator.Test.2.additionalfile"));
if (pathOfFileWithTypeName == null)
{
// no additional file found, do not generate a type.
return;
}
var @namespace = context.Compilation.SyntaxTrees.First().GetRoot().DescendantNodes().OfType<NamespaceDeclarationSyntax>().FirstOrDefault()?.Name?.ToString() ?? "NoNamespace";
// an additional file has been passed; read the type name from the file.
string generatedTypeName = File.ReadAllText(pathOfFileWithTypeName.Path);
context.AddSource(
"SG2.generated.cs",
$$"""
namespace {{@namespace}}
{
public partial class {{generatedTypeName}}
{
}
}
""");
}
public void Initialize(GeneratorInitializationContext context)
{
}
}
注意:此示例仅用于演示如何使用分析器上下文检查其他文件。生产就绪的源生成器需要更全面的代码来处理错误并确保正确的功能和性能。
在前面的筛选示例中,Analyzer1和Analyzer2都可以检索以其中任何一个命名的 Assembly3 的其他文件。每个分析器负责检查附加文件中是否有可以使用的任何数据。
还可以使用编辑器代码中的 ScriptCompilerOptions.RoslynAdditionalFilePaths 属性检索给定程序集包含的其他文件列表。