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>
后续验证步骤
- 重新编译项目,Injectio的源生成器会读取到
<InjectioName>的值,生成名为AddLibrary()的服务扩展方法 - 修改Program.cs中的服务注册代码,将
services.AddTest()替换为services.AddLibrary():var host = new HostBuilder() .ConfigureServices(services => { services.AddLibrary(); // 替换为生成的新方法 }) .ConfigureLogging(x => x.AddConsole()) .UseConsoleLifetime() .Build(); - 运行项目,验证服务注册正常生效
额外说明
你提到调试ServiceGenerator.cs第68行时发现属性未被读取,配置<CompilerVisibleProperty>后,该代码就能正确获取到InjectioName的值,从而生成符合预期的扩展方法名称。
内容的提问来源于stack exchange,提问作者nop
相关产品推荐
相关产品推荐

