在Linux(WSL)运行Gtk#应用时抛出System.DllNotFoundException的原因?
在Windows系统中使用GtkSharp库编译Hello World应用,分别针对Windows和Ubuntu编译后,Windows端可正常运行,但在WSL Ubuntu中运行时抛出以下异常:
Unhandled exception. System.TypeInitializationException: The type initializer for 'Gtk.Application' threw an exception.
---> System.DllNotFoundException: Gtk: libgtk-3-0.dll, libgtk-3.so.0, libgtk-3.0.dylib, gtk-3.dll
at GLibrary.Load(Library library)
at Gtk.Application..cctor()
--- End of inner exception stack trace ---
at Gtk.Application.Init()
at GtkSharp_Application2.Program.Main(String[] args) in I:\Проекты\Programs\GtkSharp Application2\GtkSharp Application2\Program.cs:line 9
Aborted
用户确认编译后的目录包含所有托管库文件:
-rwxrwxrwx 1 lisoveliy lisoveliy 306176 Apr 25 2022 AtkSharp.dll -rwxrwxrwx 1 lisoveliy lisoveliy 120832 Apr 25 2022 CairoSharp.dll -rwxrwxrwx 1 lisoveliy lisoveliy 259072 Apr 25 2022 GLibSharp.dll -rwxrwxrwx 1 lisoveliy lisoveliy 610304 Apr 25 2022 GdkSharp.dll -rwxrwxrwx 1 lisoveliy lisoveliy 1005568 Apr 25 2022 GioSharp.dll -rwxrwxrwx 1 lisoveliy lisoveliy 142840 Dec 31 12:59 'GtkSharp Application2' -rwxrwxrwx 1 lisoveliy lisoveliy 32650 Dec 31 12:59 'GtkSharp Application2.deps.json' -rwxrwxrwx 1 lisoveliy lisoveliy 5120 Dec 31 12:59 'GtkSharp Application2.dll' -rwxrwxrwx 1 lisoveliy lisoveliy 10500 Dec 31 12:59 'GtkSharp Application2.pdb' -rwxrwxrwx 1 lisoveliy lisoveliy 179 Dec 31 12:59 'GtkSharp Application2.runtimeconfig.json' -rwxrwxrwx 1 lisoveliy lisoveliy 3370496 Apr 25 2022 GtkSharp.dll -rwxrwxrwx 1 lisoveliy lisoveliy 841872 Oct 23 21:15 Microsoft.CSharp.dll -rwxrwxrwx 1 lisoveliy lisoveliy 1232520 Oct 23 21:15 Microsoft.VisualBasic.Core.dll -rwxrwxrwx 1 lisoveliy lisoveliy 18048 Oct 23 20:52 Microsoft.VisualBasic.dll -rwxrwxrwx 1 lisoveliy lisoveliy 24704 Oct 23 21:15 Microsoft.Win32.Primitives.dll -rwxrwxrwx 1 lisoveliy lisoveliy 59008 Oct 23 21:15 Microsoft.Win32.Registry.dll -rwxrwxrwx 1 lisoveliy lisoveliy 203776 Apr 25 2022 PangoSharp.dll
问题原因
目录中的*.Sharp.dll都是.NET托管绑定库,它们仅负责调用底层原生GTK库,无法独立运行。Linux环境下需要系统本身安装libgtk-3.so.0等原生GTK 3依赖,而你当前的WSL Ubuntu系统中并未安装这些原生库。
解决步骤
在WSL Ubuntu中安装GTK 3原生依赖
打开WSL终端,执行以下命令:sudo apt update sudo apt install libgtk-3-0 libglib2.0-0 libgdk-pixbuf2.0-0 libcairo2 libpango-1.0-0这些是GtkSharp运行必需的底层原生库。
验证原生库安装状态
执行命令检查libgtk-3.so.0是否存在:ls /usr/lib/x86_64-linux-gnu/libgtk-3.so.0输出文件路径即表示安装成功。
重新运行应用
回到应用目录,执行程序:./GtkSharp\ Application2
额外说明
如果需要跨平台发布,建议直接在目标Linux系统中编译应用,确保依赖完全匹配;.NET自包含发布模式无法打包Linux原生GTK库,仍需在目标系统安装对应依赖。
内容的提问来源于stack exchange,提问作者Lisoveliy

