c# - 将 Unity 与 Source Generator 结合在一起 - Unity 在编译期间不会拾取生成的代码
问题描述
--------sofware version--------
Unity version : 2020.2.7f1
IDE : Rider 2020.3.2
--------sofware version--------
当我尝试将 Unity 与 Source Generator 结合时遇到问题。
我能够构建一个源生成器并将生成的分析器放在 Unity 中,我的 IDE 能够获取生成的代码(语法突出显示正在工作),但是当 unity 编译它时它无法找到相关的代码,因此给出编译错误。
似乎人们遇到了类似的问题,但无法找到解决方案。我试图通过第三方库强制 Unity 使用更新版本的 Compiler(3.10),但这似乎也不能解决问题。
据我所知,问题似乎是 Unity 使用的编译器已经过时,但我认为如果是这种情况,我强迫它使用更新版本的编译器的技巧应该可以解决问题。
源生成器无法正常工作的原因是什么,我该如何解决?我不介意使用黑客,因为该项目不是商业的。
更新:
我试图通过在源生成器运行时写入文件来确认我的分析器在某个时间点正在运行。我可以看到我的文件被写入配置的目录,我假设我的生成器在某个时候被使用。
obj
但是我在Unity的文件夹中看不到任何生成的源代码。这与我在 Unity 之外运行 Source Generator 时的行为不同。
这背后的可能原因是什么?
更新 2:
为了更清楚(感谢@david-ao 的建议),我认为包含修剪生成的 csproj 可能会有所帮助(在 Unity 中 csproj 是自动生成的,因此我覆盖了项目生成过程并添加了一些必要的设置):
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Analyzer Include="Assets/Analyzers/NoobJet.Analyzer.dll" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<ItemGroup>
<PackageReference Include="Microsoft.Net.Compilers.Toolset" Version="3.10.0-1.final">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<PropertyGroup>
</PropertyGroup>
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)..\..\Assets\GeneratedFiles</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
</Project>
我试图通过上述设置实现以下结果:
- 编译时引用分析器
- 将生成的文件输出到适当的目录(我故意希望它不在
obj
文件夹中) - 使用
3.10.0-1.final
编译器。
如果有帮助,这里是完整生成的 csproj 文件。
解决方案
源生成器是 .NET 5 的一项功能。Unity 不能以 .NET 5 为目标,因此使用最新的编译器对您没有帮助;请注意您链接到的 GitHub 存储库中的此注释。
Unity 甚至不支持 .NET Core 3.1 和 .NET 5 没有 LTS 毫无价值,因此我们不太可能在不久的将来看到对此的支持。
推荐阅读
- c# - 当用户单击未设置缓存的返回按钮时,防止 ASP.NET Webforms 中的页面过期消息
- php - Wordpress 间歇性失去数据库连接
- c++ - 除了调用 SetWindowCompositionAttribute 之外,对窗口进行模糊处理的要求是什么?
- mongodb - MongoDB在聚合查询中分页
- mysql - 错误:java.lang.IllegalArgumentException:给定的 id 不能为空!- 春季启动,Mysql
- node.js - 如何使用 useState 在 React 中发布 API
- c++11 - 找到三元组的数量,使得 2 个元素的总和等于同一数组中的另一个。测试用例的第一个 i/p-no。数组的第二个大小,第三个数组
- python - 使用 discord.utils.get 调用频道返回“无”
- npm - 为什么,当我全局安装 npm-package 时,它不会安装所有包依赖项,但是当我在本地安装时它会安装?
- javascript - 使用错误的凭据登录时收到警报