CommunityToolkit / CommunityToolkit/Labs-Windows

RivePlayer is not AoT compatible (Windows App SDK 1.6)

Open
#567 1 comment 2 reactions 0 assignees View on GitHub
nativeaot
Dominant language
C#
Stars
482
Forks
89
PR merge metrics
No merged PRs in 30d

Description

Seems like tests are failing as a result of some issue with RivePlayer on `Microsoft.WindowsAppSdk` 1.6-preview1+ with AoT enabled:
```
System.TypeInitializationException: The type initializer for 'RiveSharp.Factory' threw an exception. ---> System.DllNotFoundException: Unable to load DLL 'rive' or one of its dependencies: The specified module could not be found. (0x8007007E)
Stack Trace:
at RiveSharp.RiveAPI.Factory_RegisterDelegates(FactoryDelegates delegates)
at RiveSharp.Factory..cctor()
--- End of inner exception stack trace ---
at RiveSharp.Scene..ctor()
at CommunityToolkit.Labs.WinUI.Rive.RivePlayer..ctor() in /_/components/RivePlayer/src/RivePlayer.cs:line 49
at RivePlayerExperiment.Tests.ExampleRivePlayerTestClass.ComplexAsyncLoadUIExampleWithoutDispatcherTest() in D:\a\Labs-Windows\Labs-Windows\components\RivePlayer\tests\ExampleRivePlayerTestClass.cs:line 121
at RivePlayerExperiment.Tests.ExampleRivePlayerTestClass.b__12_0() in /_/ProjectHeads/AllComponents/Tests.Wasdk/obj/x64/Release/net8.0-windows10.0.22621.0/win-x64/CommunityToolkit.Tooling.TestGen/CommunityToolkit.Tooling.TestGen.UIThreadTestMethodGenerator/ComplexAsyncLoadUIExampleWithoutDispatcherTest_ExampleRivePlayerTestClass.g.cs:line 15
```

_Originally posted by @Arlodotexe in https://github.com/CommunityToolkit/Labs-Windows/issues/561#issuecomment-2305885605_

It looks like this is happening because the `Rive.RiveSharp` package is using [runtime marshalling](https://learn.microsoft.com/en-us/dotnet/standard/native-interop/disabled-marshalling) to call the native binary [under the hood](https://github.com/rive-app/rive-sharp/blob/main/RiveSharp/RiveAPI.cs#L46), which isn't AoT/trim friendly.

This issue should only be present when using Wasdk 1.6+ with AoT enabled. Other platforms are unaffected, but NativeAoT is not compatible with runtime marshalling. For more information, see [Native interoperability best practices](https://learn.microsoft.com/en-us/dotnet/standard/native-interop/best-practices).

Fixing this will require changes to the underlying library. To avoid blocking the toolkit as a whole, the tests will be disabled on Wasdk until the issue can be resolved.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.