Включите Unity с генератором исходного кода - Unity не принимает сгенерированный код во время компиляции
--------sofware version--------
Unity version : 2020.2.7f1
IDE : Rider 2020.3.2
--------sofware version--------
У меня возникают проблемы, когда я пытаюсь интегрировать Unity с Source Generator.
Я могу создать генератор исходного кода и поместить полученный анализатор в Unity, моя IDE может получить сгенерированный код (выделение синтаксиса работает), однако, когда Unity компилирует его, он не смог найти связанный код и, следовательно, дать ошибка компиляции.
Кажется, у людей возникают похожие проблемы, но они не могут найти решения. Я пытался заставить Unity использовать более новую версию компилятора (3.10) с использованием сторонней библиотеки, но это, похоже, тоже не решило проблему.
Насколько я понимаю, проблема заключается в том, что компилятор, который использует Unity, устарел, но я предполагаю, что мой взлом, заставивший его использовать более новую версию компилятора, должен был решить проблему, если это так.
В чем причина того, что генератор исходного кода не работает, и как я могу это обойти? Я не против использования хаков, так как проект не коммерческий.
3 ответа
Генераторы исходного кода - это функция .NET 5. Unity не может работать с .NET 5, поэтому использование последней версии компилятора вам не поможет; обратите внимание на эту заметку в репозитории GitHub, с которым вы связались.
Ничего не стоит, что Unity даже не поддерживает .NET Core 3.1, а .NET 5 не будет иметь LTS, поэтому маловероятно, что мы увидим поддержку этого в ближайшем будущем.
Я пишу это в августе 2022 года, и Unity прямо сейчас поддерживает генераторы исходников, и это даже задокументировано на их веб-сайте https://docs.unity3d.com/Manual/roslyn-analyzers.html .
Генераторы исходного кода — это функция C#9, строго связанная с компилятором.
Обновлять:
Можете ли вы добавить ссылку на предварительно скомпилированную dll? Вы создаете исходный генератор на netstandard2.0, ориентированный на c#9, поэтому он полностью контролируется вами. Если вы можете сказать Unity, что указанная dll является анализатором, и вам уже удалось принудительно установить более новый компилятор, ориентированный на C#9, тогда у вас будут, по крайней мере, минимальные требования для его работы, тогда, конечно, в Unity все по-другому, поэтому этого может быть недостаточно, но, по крайней мере, необходимо
Завершить обновление
Я не разработчик Unity, поэтому я не уверен на 100%, соответствует ли это вашим потребностям, но я покажу вам, что исправлено для меня в VSCode и Visual Studio с похожей проблемой, каким-то образом генераторы исходного кода работали, но IDE жаловалась.
UPD: я добавил все содержимое моего csproj, чтобы показать, какие еще ссылки мне нужны, чтобы все заработало.
Проект генератора исходного кода должен быть нацелен на netstandard2.0, но вы должны указать языковую версию как netstandard2.0 по умолчанию для C#7.3.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.9.0" />
</ItemGroup>
</Project>
Я использовал net5.0, и все работало, но ide жаловался, насколько я понимаю, IDE нужно, чтобы он был 2.0, потому что он рассматривается как анализатор.
Мой проект-потребитель - net5.0, поэтому по умолчанию у меня включен C#9, вы должны проверить, что ваш проект-потребитель использует C#9 и ссылается на проект или dll в качестве анализатора.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<RootNamespace>use_generator</RootNamespace>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\generator\generator.csproj"
ReferenceOutputAssembly="false"
OutputItemType="Analyzer" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Net.Compilers.Toolset" Version="3.9.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
</Project>
Кроме того, мне пришлось закрыть и снова открыть Visual Studio, чтобы уловить изменения, и я должен делать это каждый раз, когда меняю генератор исходного кода, функция работает, но инструменты все еще находятся на ранних стадиях.