Skip to content

Conversation

Eideren
Copy link
Collaborator

@Eideren Eideren commented Sep 13, 2025

PR Details

Given that it's a bit early for net 10, some of the readme links don't map to anything yet, for example the build tools do not exist yet. Still, I built it from Rider using the msbuild vs2026 comes with, just not too sure what we should do in that regard.

Also need to update TeamCity before merging this in

Related Issue

Types of changes

  • Docs change / refactoring / dependency upgrade
  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist

  • My change requires a change to the documentation.
  • I have added tests to cover my changes.
  • All new and existing tests passed.
  • I have built and run the editor to try this change out.

@Eideren Eideren added the area-Core Issue of the engine unrelated to other defined areas label Sep 13, 2025
@VaclavElias
Copy link
Contributor

VaclavElias commented Sep 13, 2025

This builds ok on my PC.

3 issues I found:

Issue 1

When I migrate one of the old 4.2 projects I get this error, let me know if I should create a separate issues for that or we shall add it here. I can move these to a separate issues if needed.

image
System.NullReferenceException
  HResult=0x80004003
  Message=Object reference not set to an instance of an object.
  Source=Stride.Assets
  StackTrace:
   at Stride.Assets.StridePackageUpgrader.UpgradeBeforeAssembliesLoaded(PackageLoadParameters loadParameters, PackageSession session, ILogger log, Package dependentPackage, PackageDependency dependency, Package dependencyPackage) in D:\Projects\GitHub\stride\sources\engine\Stride.Assets\StridePackageUpgrader.cs:line 295

For some reason tfm.XML is null.
image

Issue 2

When creating a new game FirstPersonShooter from the template, I get this error.

Note: The project itself is created but can't start when I try to open it through Game Studio.

System.NullReferenceException
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=Stride.Core.Assets.Editor
StackTrace:
at Stride.Core.Assets.Editor.Services.UserDocumentationService.CacheAssemblyDocumentation(Assembly assembly) in D:\Projects\GitHub\stride\sources\editor\Stride.Core.Assets.Editor\Services\UserDocumentationService.cs:line 94

image

Issue 3

We need to udpate the samples, because of IBlendThreeBuilder, probably a breaking change.

image

And update this
image

@VaclavElias
Copy link
Contributor

Issue 1 resolved. Thanks.

@Eideren
Copy link
Collaborator Author

Eideren commented Sep 14, 2025

Third one is fixed through #2893
Second likely came because of third one since FPS also uses the animation blender thingy

@VaclavElias
Copy link
Contributor

Thanks, I will try to test it all.

@VaclavElias
Copy link
Contributor

Tested all above (I didn't test all samples/tutorials/templates), and it seems to be fixed, well this below is the full error when FirstPersonShooter is upgraded from 4.2.1.2442 to 4.3.0.1 but the reason is obvious. The 4.2.1.2442 is using FastList which is removed in 4.3.0.1, and this breaking change is expected, that means we would need to highlight it in the release notes. @Eideren, am I right that FastList is removed for 4.3.0.1?

Verbose: Process dependencies for FirstPersonShooter3.Windows...
Verbose: Process dependencies for FirstPersonShooter3.Game...
Info: Upgrading project [FirstPersonShooter3.Game] to use [Stride.Core] from version [4.2.1.2442] to [4.3.0.1] will be required
Verbose: Restore NuGet packages for FirstPersonShooter3.Game...
Verbose: Restore NuGet packages for FirstPersonShooter3.Windows...
[D:\Projects\GitHub\Stride Projects\FirstPersonShooter3\FirstPersonShooter3.Game\Player\AnimationController.cs(12,52)]: Error: 'AnimationController' does not implement interface member 'IBlendTreeBuilder.BuildBlendTree(List<AnimationOperation>)'
Error: Unable to build assembly reference [D:\Projects\GitHub\Stride Projects\FirstPersonShooter3\FirstPersonShooter3.Game\bin\Debug\net10.0\FirstPersonShooter3.Game.dll]
Verbose: Loading Assets from Package [FirstPersonShooter3.Windows.sdpkg]
Verbose: Loading Assets from Package [FirstPersonShooter3.Game.sdpkg]
Warning: Could not deserialize object of type 'FirstPersonShooter3.EffectController'; replacing it with an object implementing IUnloadable
YamlException: Unable to resolve tag [!FirstPersonShooter3.EffectController,FirstPersonShooter3.Game] to type from tag resolution or registered assemblies ((Lin: 2143, Col: 54, Chr: 124987) -> (Lin: 2144, Col: 24, Chr: 125075))
   at Stride.Core.Yaml.Serialization.Serializers.TagTypeSerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\core\Stride.Core.Yaml\Serialization\Serializers\TagTypeSerializer.cs:line 81
   at Stride.Core.Yaml.Serialization.Serializers.ChainedSerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\core\Stride.Core.Yaml\Serialization\Serializers\ChainedSerializer.cs:line 109
   at Stride.Core.Yaml.ErrorRecoverySerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\assets\Stride.Core.Assets\Yaml\ErrorRecoverySerializer.cs:line 48

Warning: Could not deserialize object of type 'FirstPersonShooter3.FpsCamera'; replacing it with an object implementing IUnloadable
YamlException: Unable to resolve tag [!FirstPersonShooter3.FpsCamera,FirstPersonShooter3.Game] to type from tag resolution or registered assemblies ((Lin: 2415, Col: 54, Chr: 141046) -> (Lin: 2416, Col: 24, Chr: 141127))
   at Stride.Core.Yaml.Serialization.Serializers.TagTypeSerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\core\Stride.Core.Yaml\Serialization\Serializers\TagTypeSerializer.cs:line 81
   at Stride.Core.Yaml.Serialization.Serializers.ChainedSerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\core\Stride.Core.Yaml\Serialization\Serializers\ChainedSerializer.cs:line 109
   at Stride.Core.Yaml.ErrorRecoverySerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\assets\Stride.Core.Assets\Yaml\ErrorRecoverySerializer.cs:line 48

Warning: Could not deserialize object of type 'FirstPersonShooter3.Player.WeaponScript'; replacing it with an object implementing IUnloadable
YamlException: Unable to resolve tag [!FirstPersonShooter3.Player.WeaponScript,FirstPersonShooter3.Game] to type from tag resolution or registered assemblies ((Lin: 2420, Col: 54, Chr: 141351) -> (Lin: 2421, Col: 24, Chr: 141442))
   at Stride.Core.Yaml.Serialization.Serializers.TagTypeSerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\core\Stride.Core.Yaml\Serialization\Serializers\TagTypeSerializer.cs:line 81
   at Stride.Core.Yaml.Serialization.Serializers.ChainedSerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\core\Stride.Core.Yaml\Serialization\Serializers\ChainedSerializer.cs:line 109
   at Stride.Core.Yaml.ErrorRecoverySerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\assets\Stride.Core.Assets\Yaml\ErrorRecoverySerializer.cs:line 48

Warning: Could not deserialize object of type 'FirstPersonShooter3.Player.PlayerController'; replacing it with an object implementing IUnloadable
YamlException: Unable to resolve tag [!FirstPersonShooter3.Player.PlayerController,FirstPersonShooter3.Game] to type from tag resolution or registered assemblies ((Lin: 4965, Col: 54, Chr: 291652) -> (Lin: 4966, Col: 24, Chr: 291747))
   at Stride.Core.Yaml.Serialization.Serializers.TagTypeSerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\core\Stride.Core.Yaml\Serialization\Serializers\TagTypeSerializer.cs:line 81
   at Stride.Core.Yaml.Serialization.Serializers.ChainedSerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\core\Stride.Core.Yaml\Serialization\Serializers\ChainedSerializer.cs:line 109
   at Stride.Core.Yaml.ErrorRecoverySerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\assets\Stride.Core.Assets\Yaml\ErrorRecoverySerializer.cs:line 48

Warning: Could not deserialize object of type 'FirstPersonShooter3.Player.PlayerInput'; replacing it with an object implementing IUnloadable
YamlException: Unable to resolve tag [!FirstPersonShooter3.Player.PlayerInput,FirstPersonShooter3.Game] to type from tag resolution or registered assemblies ((Lin: 4968, Col: 54, Chr: 291885) -> (Lin: 4969, Col: 24, Chr: 291975))
   at Stride.Core.Yaml.Serialization.Serializers.TagTypeSerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\core\Stride.Core.Yaml\Serialization\Serializers\TagTypeSerializer.cs:line 81
   at Stride.Core.Yaml.Serialization.Serializers.ChainedSerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\core\Stride.Core.Yaml\Serialization\Serializers\ChainedSerializer.cs:line 109
   at Stride.Core.Yaml.ErrorRecoverySerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\assets\Stride.Core.Assets\Yaml\ErrorRecoverySerializer.cs:line 48

Warning: Could not deserialize object of type 'FirstPersonShooter3.Player.AnimationController'; replacing it with an object implementing IUnloadable
YamlException: Unable to resolve tag [!FirstPersonShooter3.Player.AnimationController,FirstPersonShooter3.Game] to type from tag resolution or registered assemblies ((Lin: 5867, Col: 54, Chr: 345565) -> (Lin: 5868, Col: 24, Chr: 345663))
   at Stride.Core.Yaml.Serialization.Serializers.TagTypeSerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\core\Stride.Core.Yaml\Serialization\Serializers\TagTypeSerializer.cs:line 81
   at Stride.Core.Yaml.Serialization.Serializers.ChainedSerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\core\Stride.Core.Yaml\Serialization\Serializers\ChainedSerializer.cs:line 109
   at Stride.Core.Yaml.ErrorRecoverySerializer.ReadYaml(ObjectContext& objectContext) in D:\Projects\GitHub\stride\sources\assets\Stride.Core.Assets\Yaml\ErrorRecoverySerializer.cs:line 48

Verbose: Loading Assets from Package [Stride.Engine.sdpkg]
Verbose: Loading Assets from Package [Stride.Graphics.sdpkg]
Verbose: Loading Assets from Package [Stride.Particles.sdpkg]
Verbose: Loading Assets from Package [Stride.Rendering.sdpkg]
Verbose: Loading Assets from Package [Stride.SpriteStudio.Offline.sdpkg]
Verbose: Loading Assets from Package [Stride.Video.sdpkg]


@Eideren
Copy link
Collaborator Author

Eideren commented Sep 17, 2025

@VaclavElias It is not, FastList is marked as obsolete, the error is about an interface method that changed from
IBlendTreeBuilder.BuildBlendTree(FastList<AnimationOperation>)
to
IBlendTreeBuilder.BuildBlendTree(List<AnimationOperation>)

@Eideren Eideren linked an issue Sep 17, 2025 that may be closed by this pull request
@Eideren Eideren linked an issue Sep 18, 2025 that may be closed by this pull request
Eideren and others added 6 commits September 29, 2025 12:55
* ci: Replace dotnet CLI with msbuild in workflows

- Added `global.json` to specify .NET SDK version `10.0.100` with `rollForward` set to `latestMinor` for compatibility and flexibility.

* fix: .NET SDK version updated

* fix: ios workload added

* fix: android workflow added

* feat: Setup Android NDK added and NDK enviroment configuration

* test: GitHub actions updated for Android

* fix: android-sdk path explicitly added

* test: Remove NDK 26.3

* test: Reversing the change

* refactor: Simplifying workflow

* test: Disabling android workload, probaly it isn't needed

* fix: android workflow re-enabled

* ci: Improve Linux compatibility in build and test scripts

- Updated `dotnet build` and `dotnet test` commands to use forward slashes (`/`) instead of backslashes (`\`) for file paths and line continuations, ensuring compatibility with Linux systems.

* feat: Install Build Dependencies step added

* fix: Make strlcat_chk and strlcpy_chk non-fatal on Linux

* feat: llvm added

* feat: lld added

* feat: Create NuGet.config added

* test: Testing another approach

* fix: Action updated

* fix: Updates reversed

* test: Path test added

* test: Configure NuGet Sources added

* fix: Semicolon replaced

* fix: Paths corrected

* test: Additinal updates

* fix: Action updated

* text: Projects from editor folder removed

* test: Custom source disabled

* test: Removing Windows specific tests

* ci: Clean up

* ci: Removig a comment

* fix: Reversing the changes back
@Eideren
Copy link
Collaborator Author

Eideren commented Oct 13, 2025

@VaclavElias having a global.json just for github's CI isn't great from a maintenance standpoint, I'm guessing it is required ?
Most tests failed, do I have to do anything else ?

@VaclavElias
Copy link
Contributor

These failes are actually ok and expected. The tests are failing because the old (.NET 8) GitHub Actions are run from the master branch on your .NET 10 changes.

The new GitHub Actions you merged aren't run. They can be run only if:

  • we had .NET 10 branch, or
  • once you merge .NET 10 to master, or
  • you run them in your repository, manually on .NET 10 branch

Regarding global.json that's a temporary solution. Once GitHub Action supports .NET 10 be default we can remove it. Or if you would like, we could do another temporary solution e.g. just injecting/creating global.json when a GitHub Action runs. Or rename it to global-temporary.json so it doesn't affect local PC builds and work, and the GitHub Action would rename it to global.json.

@Eideren
Copy link
Collaborator Author

Eideren commented Oct 13, 2025

Right, forgot about that part !
Yep, I would prefer having the suggestions you mentioned, feel free to do another PR and I'll merge it in :)

@VaclavElias
Copy link
Contributor

Ok, I will do a follow up PR.

Copy link
Member

@Kryptos-FR Kryptos-FR left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a few remarks.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should also migrate to the .slnx file instead of the old .sln, though I don't know how that will work with ReSharper/Rider, as well as filtered solutions (.slnf).

In addition, having the solution files in the build folder always felt wrong to me. I think we should move the main one (Stride.sln) to the sources folder. Filtered solutions could stay there, and old Stride.xxx.sln should be replaced by filtered solutions (that means the Launcher should be part of the main solution).

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kind of out of the scope of this one, let's get this in and migrate afterwards I think. On top of that, I barely looked at these new features so I would rather avoid taking care of it until I am more familiar with that.

-v:m -p:WarningLevel=0 \
-p:Configuration=${{ github.event.inputs.build-type || inputs.build-type }} \
-p:StridePlatforms=Linux \
-p:StrideGraphicsApis=OpenGL \
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The trailing \ might make this command fail.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Trailing \ is actually ok. Already tested. This GitHub Action fails because of Windows (Game Studio) dependencies. This GitHub Action, or the project it is referencing needs to be updated, so the project doesn't reference Windows references because this actions runs on Linux runner.

Copy link
Member

@Kryptos-FR Kryptos-FR Oct 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This workflow isn't supposed to work yet (on master). It was added as a convenience so that we can target other branches, especially one where work on Linux build is being done. It is not called from the main workflow at the moment.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I saw that. I tried to fix it for .NET 10 and realised those references and that most likely it is unfinished. Thanks for a confirmation. We can leave it then till the right time comes later on. I was able to fix at least some parts which should help to run this actions once it is finalised/fixed/corrected.

<StrideCompileAssetCommand Condition="'$(StrideCompileAssetCommand)' == '' And Exists('$(MSBuildThisFileDirectory)..\lib\net8.0-windows7.0\') And $(TargetFramework.Contains('-windows'))">$(MSBuildThisFileDirectory)..\lib\net8.0-windows7.0\Stride.Core.Assets.CompilerApp.dll</StrideCompileAssetCommand>
<StrideCompileAssetCommand Condition="'$(StrideCompileAssetCommand)' == '' And Exists('$(MSBuildThisFileDirectory)..\lib\net8.0\')">$(MSBuildThisFileDirectory)..\lib\net8.0\Stride.Core.Assets.CompilerApp.dll</StrideCompileAssetCommand>
<StrideCompileAssetCommand Condition="'$(StrideCompileAssetCommand)' == '' And Exists('$(MSBuildThisFileDirectory)..\Stride.Core.Assets.CompilerApp.csproj')">$(MSBuildThisFileDirectory)..\bin\$(Configuration)\net8.0\Stride.Core.Assets.CompilerApp.dll</StrideCompileAssetCommand>
<StrideCompileAssetCommand Condition="'$(StrideCompileAssetCommand)' == '' And Exists('$(MSBuildThisFileDirectory)..\lib\net10.0-windows7.0\') And $(TargetFramework.Contains('-windows'))">$(MSBuildThisFileDirectory)..\lib\net10.0-windows7.0\Stride.Core.Assets.CompilerApp.dll</StrideCompileAssetCommand>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the -windows7.0 suffix still valid?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Documentation hasn't been updated to net10, but 9 did still use 7.0 as the default os version value https://learn.microsoft.com/en-us/dotnet/standard/frameworks
And building Stride.Samples.Templates does produce a nuget package containing a directory with path \lib\net10.0-windows7.0

@Kryptos-FR
Copy link
Member

Kryptos-FR commented Oct 18, 2025

@Eideren I tried to push to your branch, but somehow it doesn't work even though you enabled Maintainers are allowed to edit this pull request.

You can cherry-pick this commit which should make most build work: Kryptos-FR/stride@206df68

@Eideren
Copy link
Collaborator Author

Eideren commented Oct 19, 2025

@Kryptos-FR had an issue with that feature as well , you'll have to remove the deprecated lfs hook in your .git\pre-push file

@Kryptos-FR
Copy link
Member

Kryptos-FR commented Oct 19, 2025

@Eideren I already did that. It's a different error. It tells me I don't have the rights to push. Could be a settings on your repo maybe. It worked fine for another PR where I could push a new commit.

@Eideren
Copy link
Collaborator Author

Eideren commented Oct 19, 2025

I don't have anything on my end to control that as far as I can tell - In any case, your change has been cherry-picked, so if there's nothing else I think we can go ahead and merge

@Kryptos-FR
Copy link
Member

Looks like global.json needs to be at the root actually. It worked for me on my repo.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-Core Issue of the engine unrelated to other defined areas

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Launcher] Add/Update Visual Studio extension to VS 2026 Check if we need to install extra components

3 participants