Bug 3289

Summary: dotNet2.0 Проблема при загрузке шрифтов
Product: WINE@Etersoft Reporter: Виталий Перов <vitperov>
Component: dotNET; .NET; monoAssignee: Виталий Перов <vitperov>
Status: CLOSED FIXED QA Contact:
Severity: minor    
Priority: P4 CC: lav
Version: 1.0.9   
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 1217, 1665    

Description Виталий Перов 2009-01-17 20:20:57 MSK
При запуске графических .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]
Comment 1 Виталий Перов 2009-01-19 17:20:12 MSK
Написал тестовую программу.
Выложил на /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)
Comment 2 Vitaly Lipatov 2009-02-24 09:01:18 MSK
Если скопировать все виндовые растровые шрифты?
Comment 3 Виталий Перов 2009-02-27 13:14:49 MSK
Скопировал все шрифты. Ничего не изменилось
Comment 4 Виталий Перов 2009-03-21 15:41:32 MSK
Условия немного изменились:
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."
Comment 5 Виталий Перов 2009-03-21 16:50:02 MSK
странно, но по умолчанию загружается встроенная mscoree.dll:
fixme:mscoree:LoadLibraryShim (0x4876010 L"Gdiplus.dll", (nil), (nil), 0x32e774): semi-stub

загрузка сторонней ничего не меняет

Нашёл проблему: использовалась gdiplus.dll, создаваемая при установке wine.
Если использовать нормальную, то всё работает!!!

Проверил тест на создание формы - тест запускается. Со шрифтами проблем нет.
Comment 6 Виталий Перов 2009-03-21 17:00:05 MSK
Программы .Net1.1 прекрасно запускаются.
Сейчас программы .Net2.0 пока не запускаются. Но, возможно причина в неверной установке.
Comment 7 Виталий Перов 2009-03-21 18:01:00 MSK
Пока закрываю потому, что проблему со шрифтами пока не воспроизвести.

Приложения .Net2.0 не запускаются, но сейчас проблема в другом.
Comment 8 Vitaly Lipatov 2009-03-24 14:24:28 MSK
1. Не ясно, про какой dotNET бага.
2. Не ясно, каким образом она решена, если по поводу gdiplus ничего в поставке WINE@Etersoft сделано не было.
Comment 9 Виталий Перов 2009-03-24 16:46:21 MSK
Честно говоря, не помню по какой версии .Net бага была заведена изначально.
Но сейчас ситуация такая:

* dotNet 1.1 - всё прекрасно работает. Баги нет.

* dotNet 2.2 - багу воспроизвести не удаётся. Падает даже на самых простых программах, где не используются шрифты.

Поэтому в данный момент эту багу никак не воспроизвести
Comment 10 Виталий Перов 2009-04-03 14:02:35 MSD
Проверил после закрытия баги 2666. Тестовая форма прекрасно отображается