Интересная особенность Xwt.Gtk
В составе кросс-платформенного тулкита XWT есть такой контрол, как Spinner. В нативном тулките GTK+ он присутствует, по идее он должен существовать и в производных фреймворках. Но в GTK# его почему-то нет. Поэтому, в ХШТ сделали извращения с прямыми вызовами GTK+ через P/Invokи. При внедрении Xwt.Spinner’a под Linux возможно вылетание ошибки TargetInvocationException с таким вот стеком вызовов:
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.DllNotFoundException: libgtk-win32-2.0-0.dll
at (wrapper managed-to-native) Xwt.GtkBackend.Spinner:gtk_spinner_new ()
at Xwt.GtkBackend.Spinner..ctor () [0x00000] in :0
at Xwt.GtkBackend.SpinnerBackend..ctor () [0x00000] in :0
Я начал разбираться в исходниках Xwt и создал баг в трекере этого проекта. Суть заключается в следующем: данный контрол создаётся через вызовы библиотеки «libgtk-win32-2.0-0.dll», и на Windows это не создаёт трудностей. Но на других ОС библиотеки libgtk-win32 не существует. Разработчики Xwt (а это, не будем забывать, отнюдь не любительский проект, а open-source проект фирмы Xamarin) не дураки и сделали подстановку библиотек через файл «Xwt.Gtk.dll.config». Об этом нигде не говорится, ну я и забил на .config’и и скопировал к своему EXE-шнику только сами DLL. Само собой, CLR начала грузить то, что указано в DLL. Поэтому при работе с кросс-платформенными библиотеками на .NET стоит помнить о важности «каких-то там пользовательских конфигов» (хотя это не совсем user config) и не забывать их при сборке установочного пакета.
Полный список функций бакенда Xwt.Gtk, содержащих вызовы Win32 и уязвимых перед отсутствием точкаconfig-файла можно найти обычным поиском строки «[DllImport » по проекту Xwt.Gtk.sln.
Поделиться в соцсеть
Оставить комментарий