[Linux] runtimes/<rid>/native/ not probed on Ubuntu — _linuxRiDs fallback list missing "ubuntu" (regression of #652)
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 76/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Quiet
- Tech stack
- csharp, linux
- Domain
- operating-systems, tooling
Research direction
Start with src/Core/Silk.NET.Core/Loader/DefaultPathResolver.cs, especially _linuxRiDs, GuessFallbackRid, and GetAllRuntimeIds. Reproduce with a framework-dependent Ubuntu build, then verify that the resolver reaches runtimes/linux-x64/native/ and Silk.NET.Windowing.Window.Create succeeds without a RuntimeIdentifier or system GLFW installation.
Written by the indexing model from the issue text.
Description
Summary
On Ubuntu / Ubuntu-derived distros, Silk.NET 2.22.0's native loader does not probe runtimes/<rid>/native/ for bundled native libraries because the hardcoded _linuxRiDs fallback list in DefaultPathResolver.cs is missing "ubuntu".
The bundled libglfw.so.3 shipped by the Silk.NET NuGet package is therefore unreachable, and Silk.NET.Windowing.Window.Create(...) throws:
System.PlatformNotSupportedException: Couldn't find a suitable window platform.
(GlfwPlatform - not applicable)
at Silk.NET.Windowing.Window.Create(WindowOptions options)
This is the same symptom as #652 (which #661 was supposed to fix). The RuntimesFolderResolver / NativePackageResolver machinery added in #661 is still there in 2.22.0, but it can't reach linux-x64 from ubuntu.24.04-x64 on a modern .NET SDK because of the missing fallback entry.
Environment
- Silk.NET: 2.22.0
- OS: Pop!_OS 24.04 LTS (Ubuntu-based), kernel 6.18.7, x86_64
- .NET SDK: 10.0.107
- Session: Wayland (with XWayland;
DISPLAY=:1) - Build: framework-dependent
dotnet build(no<RuntimeIdentifier>set, nodotnet publish) RuntimeEnvironment.GetRuntimeIdentifier()reports:ubuntu.24.04-x64
Root cause (traced through the v2.22.0 source)
In src/Core/Silk.NET.Core/Loader/DefaultPathResolver.cs:
private static readonly string[] _linuxRiDs =
{
"alpine", "android", "arch", "centos", "debian", "exherbo", "fedora", "freebsd", "gentoo", "linux",
"opensuse", "rhel", "sles", "tizen"
};
GuessFallbackRid("ubuntu.24.04-x64") splits on - giving split[0] = "ubuntu.24.04", then runs _linuxRiDs.Any(x => split[0].StartsWith(x)). "ubuntu.24.04" does not start with any of those prefixes ("ubuntu" is missing), so the function returns null.
In GetAllRuntimeIds, that means:
currentRid = "ubuntu.24.04-x64"is added.AddFallbackswalksctx.RuntimeGraphfor an entry whoseRuntime == "ubuntu.24.04-x64". On modern .NET (8+), framework-dependent deps.json files have an empty or minimalruntimessection (RID graphs were largely retired in favor of portable RIDs), so this lookup misses.GuessFallbackRidis called as the last-resort path → returns null →linux-x64is never added.
So TryLocateNativeAssetInRuntimesFolder only ever tests runtimes/ubuntu.24.04-x64/native/<libname> (which doesn't exist — NuGet places the assets under the portable RID linux-x64) and TryLocateNativeAssetFromDeps never matches a runtime asset either.
strace evidence
strace -f -e openat of the failing run, filtered to glfw probes, showing zero runtimes/linux-x64/native/ lookups:
openat("/lib/x86_64-linux-gnu/libglfw.so.3.3", ...) = ENOENT
openat("/usr/lib/x86_64-linux-gnu/libglfw.so.3.3", ...) = ENOENT
openat("/lib/libglfw.so.3.3", ...) = ENOENT
openat("/usr/lib/libglfw.so.3.3", ...) = ENOENT
openat("<exe-dir>/libglfw.so.3.3", ...) = ENOENT
openat("/lib/x86_64-linux-gnu/libglfw.so.3", ...) = ENOENT
openat("/usr/lib/x86_64-linux-gnu/libglfw.so.3", ...) = ENOENT
openat("/lib/libglfw.so.3", ...) = ENOENT
openat("/usr/lib/libglfw.so.3", ...) = ENOENT
openat("<exe-dir>/libglfw.so.3", ...) = ENOENT
openat("/lib/x86_64-linux-gnu/libglfw.so", ...) = ENOENT
openat("/usr/lib/x86_64-linux-gnu/libglfw.so", ...) = ENOENT
openat("/lib/libglfw.so", ...) = ENOENT
openat("/usr/lib/libglfw.so", ...) = ENOENT
openat("<exe-dir>/libglfw.so", ...) = ENOENT
The bundled lib is on disk and works:
$ ls <exe-dir>/runtimes/linux-x64/native/libglfw.so.3
<exe-dir>/runtimes/linux-x64/native/libglfw.so.3
$ # dlopen + glfwInit on it returns 1, GLFW 3.4.0 with Wayland + X11 + EGL
Repro
Any project that:
- References
Silk.NET2.22.0 - Calls
Silk.NET.Windowing.Window.Create(WindowOptions.Default)on Ubuntu / Ubuntu-derived - Is run from a normal
bin/<config>/<tfm>/build output (nodotnet publish, no<RuntimeIdentifier>)
Workarounds (confirmed)
Any of these makes it succeed:
LD_LIBRARY_PATH="$PWD/runtimes/linux-x64/native" ./MyApp- Symlinking/copying
runtimes/linux-x64/native/libglfw.so.3next to the exe apt install libglfw3(so it's found in/usr/lib/x86_64-linux-gnu/)- Setting
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>in the csproj
Suggested fix
Minimal, low-risk: add "ubuntu" (and probably "pop", "linuxmint") to _linuxRiDs in DefaultPathResolver.cs. That alone unblocks the most common case.
Better fix: when the SDK reports a distro-specific RID like ubuntu.24.04-x64, walk it down to the portable RID linux-x64 directly rather than relying on a hand-maintained distro-prefix list. Modern .NET has been moving toward portable-RID-only for years, so SDK output drifting away from the legacy graph is going to keep happening.
Cross-reference
- #652 — original report, same symptom on Linux
- #661 — landed the resolver chain that should handle this, but the fallback list it depends on hasn't been kept up to date with what
Microsoft.DotNet.PlatformAbstractionsactually returns on newer SDKs
- Dominant language
- C#
- Stars
- 5.2k
- Forks
- 477
- Avg merge
- 1d 20h
- Merged PRs (30d)
- 1
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from dotnet/Silk.NET
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
-
bug
Difficulty 4/5 3-5 days Newbie friendliness 48/100
-
bug good first issue verify-3.0
Difficulty 4/5 3-5 days Newbie friendliness 52/100
-
bug verify-3.0
Difficulty 4/5 3-5 days Newbie friendliness 35/100
-
bug
Difficulty 3/5 1-2 days Newbie friendliness 55/100
Similar issues
-
area:frontend bug FE P3
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
klasolsson81/jobbliggaren#2010 ·
Maintainers usually reply within 1 day
-
agentic-workflows untriaged
Difficulty 1/5 Under an hour Newbie friendliness 65/100
Maintainers usually reply within 1 day
-
area: homeblaze type: bug
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
RicoSuter/Namotion.Interceptor#630 ·
Maintainers usually reply within 1 day
-
Akka.Hosting enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
-
bug needs-triage
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
microsoft/microsoft-ui-xaml#12158 ·
Maintainers usually reply within 1 day