При запуске .net програм возникает проблема при поиске System.Windows.Forms. System.Windows.Forms.dll лежит в папке с .net, но система ещё на находит. При этом в консоле можно увидеть: fixme:shell:URL_ParseUrl failed to parse L"System.Windows.Forms"
Сделал тестовую программу, отображающую простую форму. Выложил на /var/ftp/pub/Windows/Tests/DotNetTest
Во-первых для того, чтобы убрать падение при запуске программ надо скопировать l_intl.nls в system32
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 не используется. Поэтому вызывается она непосредственно из программы.
Уже есть готовый тест на функцию UrlGetPart, который показывает, что на такие входные данные как ""mscorlib.resources" функция возвращает неверное значение и оставляет нетронутым выходной буфер (в отличие от winxp). Исправил функцию так, чтобы тесты проходили. Отправил патч. Но при запуске .net программ ничего не изменилось. Видимо проблема в другом.
Для вывода лога .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.
Очевидно, что .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)
Добавление заглушки проблему не решило. Если всё же возвращать 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()
Проверил на простой программе, которая пишет в консоль "Hello". Работает. Значит это проблема с поддержкой System.Drawing.dll
Проблема вынесена в отдельную багу (#3289)
Сейчас программы dotNet1.1 прекрасно запускаются (см багу 3289)
для 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.
трэйс по каналу файл, в частности показывает, что 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 не добавляется еще при создании этой директории.
имя mscorlib дается при установке dotnet20, к тому же сама установка завершается ошибкой
в качестве временной меры можно сделать замену на верное имя в функции wine_nt_to_unix_file_name. нужно протестить для основательного решения, нужно что-то делать в установкой dotnet через winetricks
в этой директории много чего не хватает после создания. так что просто заменить имя не получится. к тому же обнаружились непонятные вещи вроде 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 пока не удалось выяснить в чем дело
при запуске 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 в папке действительно нет
странно, но при создании .pdb-файлов функция CreateFileW завершается без ошибки. однако ошибки все равно возникают, но с сознанием .pdb-файлов они не связаны.
дело не в файлах 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"
все, что связано с проблемой 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;
постоянно запрашивает %1.dll
ссылка на 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-файлов в ней нет.
видимо ru\\mscorlib.resources.dll заменена на их ru\\ezvit.resources.dll. соответственно найти mscorlib.resources.dll, а затем собрать mscorlib.resources.exe не получается.
происходит поиск \\windows\\assembly\\GAC_32\\mscorlib.resources\\2.0.0.0_ru_b77a5c561934e089 а имеется \\windows\\assembly\\GAC_32\\mscorlib.resources\\2.0.0.0__b77a5c561934e089
для получения логов 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\ папка уже должна быть, бэкслэш в конце не просто так
=== 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.
вероятно какие-то проблемы с версией сборки. на данный момент msvcm90 Version=9.0.30729.4148
замена msvcm90 на версию 9.0.21022.8 не помогла
в логах проблемы с 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. установка прошла успешно.
ru.nlp в windows нет. видимо она и не нужна. правда не понятно зачем она ее тогда ищет.