Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 3286 - Запуск программ .Net 1.1   Make a simular bug
Summary: Запуск программ .Net 1.1
Status: CLOSED FIXED
Alias: None
Product: WINE@Etersoft
Classification: Продукты (Products)
Component: dotNET; .NET; mono (show other bugs)
Version: 1.0.9
Hardware: PC All
: P4 normal
Target Milestone: ---
Assignee: Виталий Перов
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on: 2666 3287
Blocks: 1665 1217
  Show dependency treegraph
 
In work:
Reported: 2009-01-16 22:34 MSK by Виталий Перов
Modified: 2012-07-11 19:42 MSK (History)
2 users (show)

See Also:
Заявки RT:
Связано с:
Дата напоминания:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Виталий Перов 2009-01-16 22:34:01 MSK
При запуске .net програм возникает проблема при поиске System.Windows.Forms.
System.Windows.Forms.dll лежит в папке с .net, но система ещё на находит.

При этом в консоле можно увидеть:
fixme:shell:URL_ParseUrl failed to parse L"System.Windows.Forms"
Comment 1 Виталий Перов 2009-01-17 13:37:47 MSK
Сделал тестовую программу, отображающую простую форму.
Выложил на /var/ftp/pub/Windows/Tests/DotNetTest
Comment 2 Виталий Перов 2009-01-17 14:05:00 MSK
Во-первых для того, чтобы убрать падение при запуске программ надо скопировать l_intl.nls в system32
Comment 3 Виталий Перов 2009-01-17 14:58:38 MSK
URL_ParseUrl проваливается на первой же проверке:
work = URL_ScanID(pl->pScheme, &pl->szScheme, SCHEME);
if (!*work || (*work != ':')) {FIXME("EX1\n");goto ErrorExit;}

Вообще URL_ParseUrl нужна для получения из url структуры WINE_PARSE_URL (порт, пароль, имя пользователя, запрос...)

Думаю данная функция вызвается ошибочно.

Функция вызывается из WINAPI UrlGetPartW и запрашивает URL_PART_SCHEME.

UrlGetPartW внутри кода wine не используется. Поэтому вызывается она непосредственно из программы.

Comment 4 Виталий Перов 2009-01-17 17:09:47 MSK
Уже есть готовый тест на функцию UrlGetPart, который показывает, что на такие входные данные как ""mscorlib.resources" функция возвращает неверное значение и оставляет нетронутым выходной буфер (в отличие от winxp).

Исправил функцию так, чтобы тесты проходили. Отправил патч.
Но при запуске .net программ ничего не изменилось. Видимо проблема в другом.
Comment 5 Виталий Перов 2009-01-17 17:22:51 MSK
Для вывода лога .NET надо в реестре поставить значение [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) = 1.

Лог:
=== Pre-bind state information ===
LOG: User = NT AUTHORITY\INTERACTIVE
LOG: DisplayName = System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
 (Fully-specified)
LOG: Appbase = file:///C:/DotNetTest/
LOG: Initial PrivatePath = NULL
Calling assembly : WindowsFormsApplication2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using machine configuration file from C:\windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Publisher policy file is not found.
LOG: Post-policy reference: System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
LOG: Attempting download of new URL file:///C:/DotNetTest/System.Windows.Forms.DLL.
LOG: Attempting download of new URL file:///C:/DotNetTest/System.Windows.Forms/System.Windows.Forms.DLL.
LOG: Attempting download of new URL file:///C:/DotNetTest/System.Windows.Forms.EXE.
LOG: Attempting download of new URL file:///C:/DotNetTest/System.Windows.Forms/System.Windows.Forms.EXE.


Как видно из лога, System.Windows.Forms.DLL ищется в директории с программой.
Если его туда положить, то лог изменяется на:

.......
LOG: Attempting download of new URL file:///C:/DotNetTest/System.DLL.
LOG: Attempting download of new URL file:///C:/DotNetTest/System/System.DLL.
LOG: Attempting download of new URL file:///C:/DotNetTest/System.EXE.
LOG: Attempting download of new URL file:///C:/DotNetTest/System/System.EXE.
Comment 6 Виталий Перов 2009-01-17 17:37:02 MSK
Очевидно, что .Net ищет необходимые dll не в той директории.
Посмотрел файл C:\windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config. Там прописаны только библиотеки и их версии. Пути к файлам там не указываются.

Если на время оставить эту проблему, и положить в папку с программой
System.dll и System.Drawing.dll, то приложение падает на нериализованной загрушке:

  1 0x7e147356 __wine_spec_unimplemented_stub+0x36(module="gdiplus.dll", function="GdipCreateBitmapFromHICON") [/srv/vitperov/Projects/wine-eter/dlls/winecrt0/stub.c:35] in gdiplus (0x0032e834)
Comment 7 Виталий Перов 2009-01-17 19:10:38 MSK
Добавление заглушки проблему не решило.

Если всё же возвращать Ok вместо NotImplemented, то программа идёт чуть дальше:
fixme:shell:URL_ParseUrl failed to parse L"System.Drawing.resources"
fixme:gdiplus:GdipCreateBitmapFromHICON (0x118e 0x32e89c):stub
fixme:gdiplus:GdipGetImageRawFormat stub
fixme:gdiplus:GdipSetImageAttributesColorKeys not implemented
fixme:imm:ImmDisableIME (-1): stub

При замене gdiplus.dll на сторонюю FIXME пропадают, но поведение программы не изменяется

Если ещё заменить imm32.dll на сторонюю, то программа работает немного по-другому:

fixme:shell:URL_ParseUrl failed to parse L"System.Drawing.resources"
fixme:win:User32InitializeImmEntryTable (0x19650412): stub

Unhandled Exception: fixme:shell:URL_ParseUrl failed to parse L"mscorlib.resources"
fixme:shell:URL_ParseUrl failed to parse L"mscorlib.resources"
System.ArgumentException: Font '?' cannot be found.
   at System.Drawing.FontFamily.GetGdipGenericSansSerif()
   at System.Drawing.FontFamily.get_GenericSansSerif()
   at System.Drawing.SystemFonts.get_DefaultFont()
Comment 8 Виталий Перов 2009-01-17 20:07:51 MSK
Проверил на простой программе, которая пишет в консоль "Hello".
Работает. Значит это проблема с поддержкой System.Drawing.dll
Comment 9 Виталий Перов 2009-01-19 14:19:02 MSK
Проблема вынесена в отдельную багу (#3289)
Comment 10 Виталий Перов 2009-03-21 17:01:21 MSK
Сейчас программы dotNet1.1 прекрасно запускаются (см багу 3289)
Comment 11 Роман Дадьков 2012-07-02 17:31:09 MSK
для dotnet2.0 при запуске MEDoc
err:eventlog:ReportEventW L"NIL"
fixme:advapi:DeregisterEventSource (0xcafe4242) stub
fixme:shell:URL_ParseUrl failed to parse L"mscorlib.resources"
fixme:shell:URL_ParseUrl failed to parse L"mscorlib.resources"
System.ComponentModel.Win32Exception: Имеются дополнительные данные
   at ZvitInterface.WNet.GetRemoteNameInfo(String localPath)
   at ezvit.Program.Main(String[] args)
wine: Unhandled exception 0xe0434f4d at address 0x7ea92472 (thread 0009), starting debugger...

RaiseException возникает при обращении к библиотеке mscorwks она Export.
Comment 12 Роман Дадьков 2012-07-02 19:29:25 MSK
трэйс по каналу файл, в частности показывает, что MEDoc при запуске ищет такие вещи как 2.0.0.0_ru-RU_b77a5c561934e089 в директории, имеющей путь \\windows\\assembly\\GAC_32\\mscorlib.resources\\
однако такого пути не находит 
trace:file:wine_nt_to_unix_file_name L"\\windows\\assembly\\GAC_32\\mscorlib.resources\\2.0.0.0_ru-RU_b77a5c561934e089" not found in /net/wine/bottles/ukraine/.wine-medoc-1/dosdevices/c:/windows/assembly/GAC_32
при этом эта директория существует и файл нужный в ней есть, но путь к нему слегка другой
\\windows\\assembly\\GAC_32\\mscorlib\\2.0.0.0_ru-RU_b77a5c561934e089
думаю, что добавка .resources не добавляется еще при создании этой директории.
Comment 13 Роман Дадьков 2012-07-02 19:31:15 MSK
имя mscorlib дается при установке dotnet20, к тому же сама установка завершается ошибкой
Comment 14 Роман Дадьков 2012-07-03 20:48:44 MSK
в качестве временной меры можно сделать замену на верное имя в функции wine_nt_to_unix_file_name. нужно протестить
для основательного решения, нужно что-то делать в установкой dotnet через winetricks
Comment 15 Роман Дадьков 2012-07-04 20:36:16 MSK
в этой директории много чего не хватает после создания. так что просто заменить имя не получится.
к тому же обнаружились непонятные вещи вроде
trace:file:wine_nt_to_unix_file_name L"\\windows" not found in /net/wine/bottles/ukraine/.wine-medoc-1/dosdevices/c:/windows
trace:file:wine_nt_to_unix_file_name L"\\windows\\system32" not found in /net/wine/bottles/ukraine/.wine-medoc-1/dosdevices/c:/windows/system32
пока не удалось выяснить в чем дело
Comment 16 Роман Дадьков 2012-07-05 18:13:59 MSK
при запуске MEDoc не может создать .pdb-файл из dll.
trace:file:CreateFileW L"C:\\users\\Public\\Application Data\\Medoc\\Medoc\\ZvitInterface.pdb" GENERIC_READ FILE_SHARE_READ FILE_SHARE_DELETE  creation 3 attributes 0x10000080
...
trace:file:wine_nt_to_unix_file_name L"\\users\\Public\\Application Data\\Medoc\\Medoc\\ZvitInterface.pdb" not found in /net/wine/bottles/ukraine/.wine-medoc-1/dosdevices/c:/users/Public/Application Data/Medoc/Medoc

файла ZvitInterface.pdb в папке действительно нет
Comment 17 Роман Дадьков 2012-07-05 21:41:00 MSK
странно, но при создании .pdb-файлов функция CreateFileW завершается без ошибки. 
однако ошибки все равно возникают, но с сознанием .pdb-файлов они не связаны.
Comment 18 Роман Дадьков 2012-07-06 21:34:17 MSK
дело не в файлах
trace:file:wine_nt_to_unix_file_name L"\\??\\C:\\windows\\win.ini" -> "/net/wine/bottles/ukraine/.wine-medoc-1/dosdevices/c:/windows/win.ini"
Comment 19 Роман Дадьков 2012-07-09 15:32:38 MSK
все, что связано с проблемой trace:file:wine_nt_to_unix_file_name L"\\windows" not found in /net/wine/bottles/ukraine/.wine-medoc-1/dosdevices/c:/windows не проходит проверки в функции nt_to_unix_file_name_attr
if (status == STATUS_SUCCESS || status == STATUS_NO_SUCH_FILE)
из-за того, что значение status возвращается из функции lookup_unix_name
отсюда
/* creation fails with STATUS_ACCESS_DENIED for the root of the drive */
if (disposition == FILE_CREATE)
    return name_len ? STATUS_OBJECT_NAME_COLLISION : STATUS_ACCESS_DENIED;
Comment 20 Роман Дадьков 2012-07-09 15:55:58 MSK
постоянно запрашивает %1.dll
Comment 21 Роман Дадьков 2012-07-09 18:16:49 MSK
ссылка на mscorlib помогла. загрузка проходит чуть дальше и снова падает после
trace:file:wine_nt_to_unix_file_name L"\\users\\Public\\Application Data\\Medoc\\Medoc\\ru\\mscorlib.resources\\mscorlib.resources.exe" not found in /net/wine/bottles/ukraine/.wine-medoc-1/dosdevices/c:/users/Public/Application Data/Medoc/Medoc/
есть директория \users\\Public\\Application Data\\Medoc\\Medoc\\ru-RU, но вложенных директорий и .exe-файлов в ней нет.
Comment 22 Роман Дадьков 2012-07-09 18:24:43 MSK
видимо ru\\mscorlib.resources.dll заменена на их ru\\ezvit.resources.dll.
соответственно найти mscorlib.resources.dll, а затем собрать mscorlib.resources.exe не получается.
Comment 23 Роман Дадьков 2012-07-09 18:51:34 MSK
происходит поиск \\windows\\assembly\\GAC_32\\mscorlib.resources\\2.0.0.0_ru_b77a5c561934e089
а имеется \\windows\\assembly\\GAC_32\\mscorlib.resources\\2.0.0.0__b77a5c561934e089
Comment 24 Роман Дадьков 2012-07-10 15:06:08 MSK
для получения логов
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion
добавляем:
DWORD ForceLog значение 1
DWORD LogFailures значение 1
DWORD LogResourceBinds значение 1
String LogPath set value to folder for logs ie) C:\FusionLog\
папка уже должна быть, бэкслэш в конце не просто так
Comment 25 Роман Дадьков 2012-07-10 16:05:06 MSK
=== Pre-bind state information ===
LOG: User = eter-2\wine
LOG: DisplayName = msvcm90, Version=9.0.21022.8, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 (Fully-specified)
LOG: Appbase = file:///C:/users/Public/Application Data/Medoc/Medoc/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = ezvit.exe
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\users\Public\Application Data\Medoc\Medoc\ezvit.exe.config
LOG: Using machine configuration file from C:\windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Post-policy reference: msvcm90, Version=9.0.21022.8, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/users/Public/Application Data/Medoc/Medoc/msvcm90.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:\users\Public\Application Data\Medoc\Medoc\msvcm90.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: msvcm90, Version=9.0.30729.4148, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
WRN: Comparing the assembly name resulted in the mismatch: Revision Number
ERR: The assembly reference did not match the assembly definition found.
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
Comment 26 Роман Дадьков 2012-07-10 17:53:41 MSK
вероятно какие-то проблемы с версией сборки.
на данный момент msvcm90 Version=9.0.30729.4148
Comment 27 Роман Дадьков 2012-07-10 21:52:38 MSK
замена msvcm90 на версию 9.0.21022.8 не помогла
Comment 28 Роман Дадьков 2012-07-11 17:28:16 MSK
в логах проблемы с msvcm90 исчезли. 
на данный момент исключение возникает во время записи в файл
trace:file:CreateFileW returning 0x240
trace:file:WriteFile 0x23 0x32e508 170 0x32e4c8 (nil)
System.ComponentModel.Win32Exception: Имеются дополнительные данные
   at ZvitInterface.WNet.GetRemoteNameInfo(String localPath)
   at ezvit.Program.Main(String[] args)trace:file:WriteFile 0x23 0x79f0f994 1 0x32e700 (nil)

попробовал установить на vbox на win7. установка прошла успешно.
Comment 29 Роман Дадьков 2012-07-11 19:42:23 MSK
ru.nlp в windows нет. видимо она и не нужна. правда не понятно зачем она ее тогда ищет.