При запуске графических .net приложений возникает проблема с загрузкой шрифтов. Бактрейс (в mono более подробный, чем в .net): Unhandled Exception: System.TypeInitializationException: An exception was thrown by the type initializer for System.Windows.Forms.WindowsFormsSynchronizationContext ---> System.TypeInitializationException: An exception was thrown by the type initializer for System.Windows.Forms.ThemeEngine ---> System.ArgumentException: The requested FontFamily could not be found [GDI+ status: FontFamilyNotFound] at System.Drawing.GDIPlus.CheckStatus (Status status) [0x00000] at System.Drawing.FontFamily..ctor (GenericFontFamilies genericFamily) [0x00000] at (wrapper remoting-invoke-with-check) System.Drawing.FontFamily:.ctor (System.Drawing.Text.GenericFontFamilies) at System.Drawing.FontFamily.get_GenericSansSerif () [0x00000] at System.Drawing.Font.CreateFont (System.String familyName, Single emSize, FontStyle style, GraphicsUnit unit, Byte charSet, Boolean isVertical) [0x00000] at System.Drawing.Font..ctor (System.String familyName, Single emSize, FontStyle style, GraphicsUnit unit, Byte charSet, Boolean isVertical) [0x00000] at System.Drawing.Font..ctor (System.String familyName, Single emSize, System.String systemName) [0x00000] at (wrapper remoting-invoke-with-check) System.Drawing.Font:.ctor (string,single,string) at System.Drawing.SystemFonts.get_DefaultFont () [0x00000]
Написал тестовую программу. Выложил на /var/ftp/pub/Windows/Tests/DotNetTests/CreateFont Шрифт создаётся при помощи: Font font1 = new Font(FontFamily.GenericSerif,12.0F, FontStyle.Bold); Бактрейс падения: System.ArgumentException: Font '?' cannot be found. at System.Drawing.FontFamily.GetNativeGenericSerif() at System.Drawing.FontFamily.get_GenericSerif() at Test.Test1.Main() При отладке по каналу trace: Для шрифтов, которых нет в папке windows/Fonts: trace:font:AddFontToList Loading font file "/net/wine/bottles/dotnet/.wine-net-2.0/dosdevices/c:/windows/Fonts/vga866.fon" index 0 warn:font:AddFontToList Unable to load font "/net/wine/bottles/dotnet/.wine-net-2.0/dosdevices/c:/windows/Fonts/vga866.fon"/(nil) err = 1 trace:font:AddFontToList Loading font file "/srv/vitperov/Projects/wine-eter/loader/../fonts/vga866.fon" index 0 warn:font:AddFontToList Unable to load font "/srv/vitperov/Projects/wine-eter/loader/../fonts/vga866.fon"/(nil) err = 1 Для шрифтов, которые есть: trace:font:ReadFontDir Loading fonts from "/net/wine/bottles/dotnet/.wine-net-2.0/dosdevices/c:/windows/Fonts" trace:font:ReadFontDir Found "serife.fon" in "/net/wine/bottles/dotnet/.wine-net-2.0/dosdevices/c:/windows/Fonts" trace:font:AddFontToList Loading font file "/net/wine/bottles/dotnet/.wine-net-2.0/dosdevices/c:/windows/Fonts/serife.fon" index 0 warn:font:AddFontToList Ignoring font "/net/wine/bottles/dotnet/.wine-net-2.0/dosdevices/c:/windows/Fonts/serife.fon"/(nil)
Если скопировать все виндовые растровые шрифты?
Скопировал все шрифты. Ничего не изменилось
Условия немного изменились: 1) В тесте зачем-то ещё подключалось System.Forms 2) Проверяю на .Net 1.1 Результаты: * При использовании встроенной gdiplus.dll падения не происходит (но корректность работы этим тестом проверить нельзя) <wine@cellar bottle dotnet/net1.1>$ wwxp test.exe fixme:shell:URL_ParseUrl failed to parse L"System.Drawing" Hello fixme:shell:URL_ParseUrl failed to parse L"System" err:ole:CoGetClassObject class {00000349-0000-0000-c000-000000000046} not registered err:ole:CoGetClassObject class {00000349-0000-0000-c000-000000000046} not registered err:ole:create_server class {00000349-0000-0000-c000-000000000046} not registered fixme:ole:CoGetClassObject CLSCTX_REMOTE_SERVER not supported err:ole:CoGetClassObject no class object {00000349-0000-0000-c000-000000000046} could be created for context 0x17 fixme:mscoree:LoadLibraryShim (0x4865f18 L"Gdiplus.dll", (nil), (nil), 0x32ea78): semi-stub fixme:ole:CoGetContextToken stub fixme:gdiplus:GdiplusNotificationHook 0x6a93370 GoodBye * При использовании сторонней gdiplus.dll программа падает. Перед падением появляется сообщение: "Failed to load resources from resource file. Please check you setup."
странно, но по умолчанию загружается встроенная mscoree.dll: fixme:mscoree:LoadLibraryShim (0x4876010 L"Gdiplus.dll", (nil), (nil), 0x32e774): semi-stub загрузка сторонней ничего не меняет Нашёл проблему: использовалась gdiplus.dll, создаваемая при установке wine. Если использовать нормальную, то всё работает!!! Проверил тест на создание формы - тест запускается. Со шрифтами проблем нет.
Программы .Net1.1 прекрасно запускаются. Сейчас программы .Net2.0 пока не запускаются. Но, возможно причина в неверной установке.
Пока закрываю потому, что проблему со шрифтами пока не воспроизвести. Приложения .Net2.0 не запускаются, но сейчас проблема в другом.
1. Не ясно, про какой dotNET бага. 2. Не ясно, каким образом она решена, если по поводу gdiplus ничего в поставке WINE@Etersoft сделано не было.
Честно говоря, не помню по какой версии .Net бага была заведена изначально. Но сейчас ситуация такая: * dotNet 1.1 - всё прекрасно работает. Баги нет. * dotNet 2.2 - багу воспроизвести не удаётся. Падает даже на самых простых программах, где не используются шрифты. Поэтому в данный момент эту багу никак не воспроизвести
Проверил после закрытия баги 2666. Тестовая форма прекрасно отображается