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

Injectio源码生成器无法读取MSBuild属性的问题排查

解决Injectio无法解析MSBuild属性的问题

核心结论

必须配置<CompilerVisibleProperty>才能让Injectio的源生成器读取到你定义的<InjectioName>属性,这是源生成器的默认限制,Injectio的README底部也明确提到了这一点。

原因说明

.NET源生成器默认只能访问预定义的MSBuild属性,自定义属性需要通过<CompilerVisibleProperty>显式声明,才能被源生成器在编译阶段读取到。你当前的配置中缺少这一步,导致<InjectioName>Library</InjectioName>被忽略,生成的服务注册方法还是默认的AddTest()。

修改后的Test.csproj配置

在原项目文件中添加<CompilerVisibleProperty>声明:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net7.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
    </PropertyGroup>

    <PropertyGroup>
        <InjectioName>Library</InjectioName>
    </PropertyGroup>
    
    <!-- 添加这部分配置,暴露自定义属性给源生成器 -->
    <ItemGroup>
        <CompilerVisibleProperty Include="InjectioName" />
    </ItemGroup>
    
    <ItemGroup>
        <PackageReference Include="Injectio" Version="1.0.33" />
        <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.0" />
    </ItemGroup>
    
</Project>

后续验证步骤

  1. 重新编译项目,Injectio的源生成器会读取到<InjectioName>的值,生成名为AddLibrary()的服务扩展方法
  2. 修改Program.cs中的服务注册代码,将services.AddTest()替换为services.AddLibrary():
    var host = new HostBuilder()
        .ConfigureServices(services =>
        {
            services.AddLibrary(); // 替换为生成的新方法
        })
        .ConfigureLogging(x => x.AddConsole())
        .UseConsoleLifetime()
        .Build();
    
  3. 运行项目,验证服务注册正常生效

额外说明

你提到调试ServiceGenerator.cs第68行时发现属性未被读取,配置<CompilerVisibleProperty>后,该代码就能正确获取到InjectioName的值,从而生成符合预期的扩展方法名称。

内容的提问来源于stack exchange,提问作者nop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:35:34