Unity中生成源码无法引用OwlTree命名空间的问题排查与解决
Unity中Roslyn源码生成器无法引用OwlTree命名空间的问题解决
问题描述
在Unity中使用自定义Roslyn源码生成器时,生成的代码无法正确引用OwlTree命名空间,触发编译错误:
OwlTree.Generator\OwlTree.Generator.OwlTreeGenerator\ProjectProxyFactory.g.cs(1,7): error CS0246: 找不到类型或命名空间名称“OwlTree”(是否缺少 using 指令或程序集引用?)
同时伴随大量OwlTree命名空间下类型找不到的错误。生成的代码示例:
using OwlTree; // proxy factory所在的命名空间 using System; public class ProjectProxyFactory : ProxyFactory { ... }
已尝试的操作
- 按照Unity官方文档配置源码生成器,问题未解决;
- 将
OwlTree代码移入/移出程序集定义,无变化; - 把
OwlTree命名空间下的类型移出命名空间,错误消失; - 生成器在编辑器语言服务及Unity外的测试项目中正常工作,仅在Unity内出现问题;
- 切换生成器DLL的自动引用和验证引用选项,无效果;
- 确认Unity项目的csproj已将DLL作为分析器引入,但未包含
<EnableSourceGenerators>true</EnableSourceGenerators>。
生成器csproj配置
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <LangVersion>9.0</LangVersion> <TargetFramework>netstandard2.0</TargetFramework> <IsPackable>false</IsPackable> <ImplicitUsings>disable</ImplicitUsings> <Nullable>disable</Nullable> <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules> <IsRoslynComponent>true</IsRoslynComponent> </PropertyGroup> <ItemGroup> <PackageReference ExcludeAssets="runtime" Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.3" PrivateAssets="all"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <PackageReference ExcludeAssets="runtime" Include="Microsoft.CodeAnalysis.CSharp" Version="4.3.0" PrivateAssets="all" /> <PackageReference ExcludeAssets="runtime" Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.3.0" /> </ItemGroup> <ItemGroup> <None Include="$(OutputPath)\netstandard2.0\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" /> </ItemGroup> </Project>
更新信息
更新1:测试类验证
创建测试类:
namespace OwlTree { // 将由源码生成器生成代理 public class Test : NetworkObject { } }
生成的ProjectProxyFactory.g.cs中引用OwlTree.Test无错误,但引用OwlTree.ProxyFactory仍报错,而ProxyFactory的定义文件与测试文件均为Assets下的普通CS文件,情况异常。
更新2:Assets文件夹结构
> Assets > Framework > OwlTree > OwlTree源码 > OwlTree.Generator > 生成器dll > 上述测试类文件
更新3:问题定位与解决
最终发现问题根源:生成器被Unity应用到了主项目之外的其他两个项目中(Unity的预期行为),导致为未包含OwlTree代码的项目生成了空的代理工厂,从而引发命名空间找不到的错误。
解决方案:
- 修改源码生成器逻辑,仅当检测到需要生成代理的类时才创建代理工厂类;
- 在框架中添加默认逻辑,处理不存在代理工厂的场景。
内容的提问来源于stack exchange,提问作者CaptainToTo
相关产品推荐
相关产品推荐

