如何在实现ISourceGenerator的源代码生成器中获取宿主项目的文件路径?
获取项目A路径的实现方案
可以通过以下几种可靠方式在实现ISourceGenerator的代码中获取项目A的文件路径:
通过MSBuild属性直接传递(推荐)
在项目A的csproj文件中添加配置,将项目根目录作为编译可见属性传递给源代码生成器:<PropertyGroup> <ProjectRootPath>$(MSBuildProjectDirectory)</ProjectRootPath> </PropertyGroup> <ItemGroup> <CompilerVisibleProperty Include="ProjectRootPath" /> </ItemGroup>之后在源代码生成器中读取该属性:
if (context.AnalyzerConfigOptions.GlobalOptions.TryGetValue("build_property.ProjectRootPath", out var projectRoot)) { // 此处projectRoot即为项目A的根路径 }利用附加文件标记项目根
在项目A根目录下创建一个空的标记文件(比如ProjectRootMarker.txt),然后在csproj中配置为附加文件:<ItemGroup> <AdditionalFiles Include="ProjectRootMarker.txt" /> </ItemGroup>生成器中通过该文件路径推导项目根:
var markerFile = context.AdditionalFiles.FirstOrDefault(f => f.Path.EndsWith("ProjectRootMarker.txt")); if (markerFile != null) { var projectRoot = Path.GetDirectoryName(markerFile.Path); }通过语法树文件路径推导(依赖目录结构)
如果项目A有编译的源码文件,可从语法树路径向上推导项目根:var firstTree = context.Compilation.SyntaxTrees.FirstOrDefault(); if (firstTree != null) { var sourcePath = firstTree.FilePath; // 根据项目实际目录结构调整向上查找的层级 var projectRoot = Directory.GetParent(sourceFilePath)?.Parent?.FullName; }
注意:第三种方法依赖固定的目录结构,稳定性不如前两种,优先使用MSBuild属性传递的方案。
内容的提问来源于stack exchange,提问作者MgSam
相关产品推荐
相关产品推荐

