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

求助:Intellisense无法识别引用项目中源生成的代码提示

源生成器代码在跨项目引用时无IntelliSense提示的解决方法

项目结构

GeneratorProject (.NET Standard 2.0 C# 源生成器)
^
CoreProject (.NET 8 C# 类库)
^
UIProject (.NET 8 Blazor)

问题描述

GeneratorProject在CoreProject中生成代码,CoreProject被UIProject引用。CoreProject内输入MyObjects.时,IntelliSense能正常显示静态类下的所有对象提示;但在UIProject中,输入MyObjects.无任何提示,甚至MyObjects本身的输入补全也失效。尽管完整输入有效对象名称后代码可正常编译,悬停也能显示正确定义,但缺失提示完全抵消了生成代码的便利性。

已尝试的方案

方案1:输出编译生成文件并构建时忽略

在CoreProject.csproj中添加配置,将生成文件输出到_generated目录,构建时排除这些文件:

<PropertyGroup>
    <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
    <CompilerGeneratedFilesOutputPath>$(ProjectDir)_generated</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <NoWarn>1701;1702</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <NoWarn>1701;1702</NoWarn>
</PropertyGroup>
<Target Name="SkipSourceGeneratedFiles" BeforeTargets="CoreCompile">
    <ItemGroup>
        <Compile Remove="_generated/**/*" />
    </ItemGroup>
</Target>

该配置可让UIProject的IntelliSense恢复正常,但会触发CS0229歧义错误红线(提示生成对象重复),程序能正常运行但误报无法用于团队协作。

方案2:在UIProject中生成代理类

将GeneratorProject同时附加到UIProject,在UIProject中生成指向CoreProject生成代码的代理类:
CoreProject生成代码:

namespace CoreProject.GeneratorOutput;

public static class MyObjects
{
    public static readonly SomeObject something = new("this is an example");
}

UIProject代理代码:

namespace UIProject.GeneratorOutput;

public static class MyObjects
{
    public SomeObject something => CoreProject.GeneratorOutput.MyObjects.something;
}

此方案仅适用于静态对象列表场景,对非静态属性等场景需要复杂适配,实用性差。

技术细节

  • Visual Studio 2022 Enterprise 17.9.5
  • Core/UI项目为.NET 8 C#项目
  • GeneratorProject使用Microsoft.CodeAnalysis.CSharp 4.6.0
  • 存在最小复现项目,可在UI项目的Home.razor、UIProjectClass.cs中复现问题,Core项目的CoreClass.cs无此问题。

可行解决方案

1. 修复方案1的CS0229误报

针对方案1的歧义错误,可通过以下方式抑制:

  • 在CoreProject.csproj中添加<DisableImplicitNamespaceImports>true</DisableImplicitNamespaceImports>,然后显式导入所需命名空间,避免重复导入生成代码的命名空间。
  • 给生成的类型添加[EditorBrowsable(EditorBrowsableState.Never)]特性(需引用System.ComponentModel),让Visual Studio忽略直接显示该类型,但保留程序集引用的访问能力。

2. 更新Visual Studio版本

将Visual Studio升级到17.10及以上版本,Roslyn团队在后续版本中修复了部分跨项目源生成器的IntelliSense识别问题,可能直接解决此提示缺失问题。

3. 调整项目引用的私有资产设置

在CoreProject对GeneratorProject的引用中添加<PrivateAssets>all</PrivateAssets>,避免GeneratorProject被传递引用到UIProject,同时确保生成代码的元数据正确嵌入CoreProject程序集:

<ProjectReference Include="..\GeneratorProject\GeneratorProject.csproj">
    <PrivateAssets>all</PrivateAssets>
</ProjectReference>

此设置可防止UIProject重复运行源生成器,同时让IntelliSense正确识别CoreProject中生成的代码。

4. 启用源生成器的设计时支持

确保GeneratorProject正确实现了设计时支持,在生成器代码中添加[Generator]特性的同时,在GeneratorProject.csproj中添加配置:

<PropertyGroup>
    <GeneratorLanguageTargets>$(MSBuildProjectDirectory)\Generator.targets</GeneratorLanguageTargets>
</PropertyGroup>

同时确保生成器项目的输出类型配置为CodeGenerator。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:54:53