You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:45:41