[Linux] runtimes/<rid>/native/ not probed on Ubuntu — _linuxRiDs fallback list missing "ubuntu" (regression of #652)
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 76/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Tranquilo
- Stack tecnológico
- csharp, linux
- Área
- operating-systems, tooling
Línea de trabajo
Comienza con src/Core/Silk.NET.Core/Loader/DefaultPathResolver.cs, especialmente _linuxRiDs, GuessFallbackRid y GetAllRuntimeIds. Reprodúcelo con una compilación de Ubuntu framework-dependent y, a continuación, verifica que el resolver alcance runtimes/linux-x64/native/ y que Silk.NET.Windowing.Window.Create se ejecute correctamente sin un RuntimeIdentifier ni una instalación de GLFW en el sistema.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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
- Lenguaje dominante
- C#
- Estrellas
- 5.2k
- Forks
- 480
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de dotnet/Silk.NET
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
-
Dificultad 3/5 Medio día Aptitud para principiantes 40/100
-
bug
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
-
bug good first issue verify-3.0
Dificultad 4/5 3-5 días Aptitud para principiantes 52/100
-
Silk.net window failsAbiertobug verify-3.0
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
Todos los issues de dotnet/Silk.NET
Issues similares
-
[i18n] 安装实例完成后的成功提示未正确本地化Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
PCL-Community/PCL-CE#3658 ·
Los mantenedores suelen responder en 1 día
-
Deploy & Patch-issues opprettes ikke: create-pnd-issues.yml har feilet hver uke siden 2025-09-08Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
Altinn/altinn-auth#4359 ·
Los mantenedores suelen responder en 1 día
-
type/automation type/tech-debt
Dificultad 1/5 Menos de una hora Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
-
High-DPI fixes for release/1.3: editor toolbar icons and Color Picker layout (patch included)Abiertono-stack-trace
Dificultad 2/5 1-3 horas Aptitud para principiantes 83/100
Los mantenedores suelen responder en 1 día
-
S: Untriaged
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
project-wayfarer/wayfarer-14#1650 ·
Los mantenedores suelen responder en 2 días