https://bugs.winehq.org/show_bug.cgi?id=45930
Bug ID: 45930 Summary: Microsoft .NET Framework 4.x GAC update fails for some assemblies, 'Error compiling mscorlib, Path not found. (Exception from HRESULT: 0x80070003)' (legacy GAC missing: '%systemroot%\assembly') Product: Wine Version: 3.17 Hardware: x86-64 OS: Linux Status: NEW Severity: normal Priority: P2 Component: -unknown Assignee: wine-bugs@winehq.org Reporter: focht@gmx.net Distribution: ---
Hello folks,
as it says.
After .NET Framework 4.x installation, when manually triggering GAC update, some assemblies fail to install in pre .NET 4.0 (1.0 - 3.5) legacy GAC location because it's missing. The failure is not really critical though (has no effect on .NET 4.x apps).
NOTE: This is not MSI regression, it was afaik always present. Had this one bitrotting on my disk for at least a year.
Console output:
--- snip --- $ wine "c:\windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe" update ... 1> Compiling assembly mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 (CLR v4.0.30319) ... 0183:fixme:thread:SetThreadStackGuarantee (0x33ee40): stub 017d:err:ole:CoGetContextToken apartment not initialised 019d:err:ole:CoGetContextToken apartment not initialised 016c:fixme:shell:URL_ParseUrl failed to parse L"System.ServiceModel.Activation" 016c:fixme:shell:URL_ParseUrl failed to parse L"System.Runtime.DurableInstancing" 016c:fixme:shell:URL_ParseUrl failed to parse L"System.ServiceModel.Activities" 016c:fixme:shell:URL_ParseUrl failed to parse L"System.Activities" 016c:fixme:shell:URL_ParseUrl failed to parse L"System.Xaml.Hosting" 016c:fixme:shell:URL_ParseUrl failed to parse L"System.Activities.DurableInstancing" 016c:fixme:shell:URL_ParseUrl failed to parse L"Microsoft.VisualBasic.Activities.Compiler" 016c:fixme:shell:URL_ParseUrl failed to parse L"System" 1>Error compiling mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: Path not found. (Exception from HRESULT: 0x80070003) 016c:fixme:shell:URL_ParseUrl failed to parse L"System.EnterpriseServices" 016c:fixme:shell:URL_ParseUrl failed to parse L"System.Configuration" 0183:fixme:process:FlushProcessWriteBuffers : stub 016c:fixme:shell:URL_ParseUrl failed to parse L"System.ServiceModel" 1>Failed to generate native code for dependent image mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 because of the following error: Path not found. (Exception from HRESULT: 0x80070003) 0183:err:ole:CoReleaseMarshalData IMarshal::ReleaseMarshalData failed with error 0x8001011d --- snip ---
Trace log:
--- snip --- $ WINEDEBUG=+seh,+relay wine "c:\windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe" update >>log.txt 2>&1 ... 0009:Call KERNEL32.CreateProcessW(0033e5f4 L"C:\windows\Microsoft.NET\Framework\v4.0.30319\mscorsvw.exe",00165b30 L"C:\windows\Microsoft.NET\Framework\v4.0.30319\mscorsvw.exe -UseCLSID {49B5CB8A-401C-4FE3-9BE6-B265330F3332} -Comment "NGen Worker Process"",00000000,00000000,00000000,00000000,00000000,00000000,0033e134,0033e178) ret=60900813 ... 004b:Call KERNEL32.__wine_kernel_init() ret=7bc6d0ee ... 0049:Ret KERNEL32.CreateProcessW() retval=00000001 ret=60900813 ... 004b:Call KERNEL32.GetEnvironmentVariableW(0033f798 L"COMPlus_NGENBreakOnWorker",00000000,00000000) ret=100104e3 004b:Ret KERNEL32.GetEnvironmentVariableW() retval=00000000 ret=100104e3 ... 004b:Call KERNEL32.SearchPathW(00000000,0033eab4 L"C:\windows\Microsoft.NET\Framework\v4.0.30319\mscoree.tlb",00000000,00000105,0033e81e,00000000) ret=7e3300b5 004b:Ret KERNEL32.SearchPathW() retval=00000039 ret=7e3300b5 004b:Call KERNEL32.CreateFileW(0033e81e L"C:\windows\Microsoft.NET\Framework\v4.0.30319\mscoree.tlb",80000000,00000000,00000000,00000003,00000080,00000000) ret=7e33016c 004b:Ret KERNEL32.CreateFileW() retval=000000a8 ret=7e33016c ... 004b:Call KERNEL32.LoadLibraryExW(0033ec98 L"C:\windows\Microsoft.NET\Framework\v4.0.30319\mscoreei.dll",00000000,00000008) ret=79004b0f ... 004b:Ret PE DLL (proc=0x603b3578,module=0x603b0000 L"mscoreei.dll",reason=PROCESS_ATTACH,res=(nil)) retval=1 004b:Ret KERNEL32.LoadLibraryExW() retval=603b0000 ret=79004b0f ... 004b:Call KERNEL32.GetProcAddress(603b0000,79007ed0 "RegisterShimImplCallback") ret=79007e9c 004b:Ret KERNEL32.GetProcAddress() retval=603b6975 ret=79007e9c 004b:Call KERNEL32.GetProcAddress(603b0000,79007eb0 "RegisterShimImplCleanupCallback") ret=79007ea8 004b:Ret KERNEL32.GetProcAddress() retval=00000000 ret=79007ea8 004b:Call KERNEL32.GetProcAddress(603b0000,7900c90c "SetShellShimInstance") ret=7900c820 004b:Ret KERNEL32.GetProcAddress() retval=00000000 ret=7900c820 004b:Call KERNEL32.GetProcAddress(603b0000,7900c8f8 "OnShimDllMainCalled") ret=7900c84a 004b:Ret KERNEL32.GetProcAddress() retval=603b43ef ret=7900c84a ... 004b:Call KERNEL32.GetProcAddress(603b0000,7901ab04 "CLRCreateInstance") ret=7901aaec 004b:Ret KERNEL32.GetProcAddress() retval=603bc640 ret=7901aaec ... 004b:Call KERNEL32.CreateFileW(0033edc4 L"C:\windows\Microsoft.NET\Framework\v4.0.30319\clr.dll",00020000,00000007,00000000,00000003,10000000,00000000) ret=603b9264 004b:Ret KERNEL32.CreateFileW() retval=000000c0 ret=603b9264 ... 004b:Call KERNEL32.LoadLibraryExW(00171858 L"C:\windows\Microsoft.NET\Framework\v4.0.30319\clr.dll",00000000,00000008) ret=603b1711 ... 004b:Ret PE DLL (proc=0x791f58f0,module=0x79140000 L"clr.dll",reason=PROCESS_ATTACH,res=(nil)) retval=1 004b:Ret KERNEL32.LoadLibraryExW() retval=79140000 ret=603b1711 ... 004b:Call KERNEL32.GetProcAddress(79140000,10002034 "NGenCreateNGenWorker") ret=603b539f 004b:Ret KERNEL32.GetProcAddress() retval=79242b1b ret=603b539f ... 004b:Call advapi32.RegOpenKeyExW(80000002,792a453c L"Software\Microsoft\Fusion",00000000,00020019,0033e348) ret=7918cbff 004b:Ret advapi32.RegOpenKeyExW() retval=00000002 ret=7918cbff ... 004b:Call KERNEL32.GetProcAddress(7b420000,792a4804 "GetSystemWindowsDirectoryW") ret=792a47e7 004b:Ret KERNEL32.GetProcAddress() retval=7b431c1c ret=792a47e7 004b:Call KERNEL32.GetSystemWindowsDirectoryW(7972f058,00000105) ret=792a47f5 004b:Ret KERNEL32.GetSystemWindowsDirectoryW() retval=0000000a ret=792a47f5 ... 004b:Call advapi32.RegOpenKeyExW(80000002,0033e4a4 L"Software\Microsoft\Fusion\NativeImagesIndex\v4.0.30319_32",00000000,00020019,0018f97c) ret=7918cbff 004b:Ret advapi32.RegOpenKeyExW() retval=00000002 ret=7918cbff ... 004b:Call KERNEL32.GetFileAttributesW(0033e554 L"C:\windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll") ret=791de214 004b:Ret KERNEL32.GetFileAttributesW() retval=00000020 ret=791de214 ... 004b:Call KERNEL32.lstrlenW(00176b80 L"v4.0.30319") ret=79299594 004b:Ret KERNEL32.lstrlenW() retval=0000000a ret=79299594 004b:Call KERNEL32.lstrlenW(79299670 L"\NativeImages_") ret=7929959d 004b:Ret KERNEL32.lstrlenW() retval=0000000e ret=7929959d 004b:Call KERNEL32.lstrlenW(7922b37c L"\assembly") ret=792995a6 004b:Ret KERNEL32.lstrlenW() retval=00000009 ret=792995a6 004b:Call KERNEL32.lstrlenW(7972f058 L"C:\windows") ret=792995b1 004b:Ret KERNEL32.lstrlenW() retval=0000000a ret=792995b1 004b:Call shlwapi.PathRemoveBackslashW(7972e700 L"C:\windows") ret=792995e7 004b:Ret shlwapi.PathRemoveBackslashW() retval=7972e712 ret=792995e7 004b:Call KERNEL32.lstrlenW(7972e700 L"C:\windows\assembly\NativeImages_v4.0.30319_32") ret=7924643b 004b:Ret KERNEL32.lstrlenW() retval=0000002e ret=7924643b 004b:Call KERNEL32.CreateDirectoryW(0033e86c L"C:\windows\assembly\NativeImages_v4.0.30319_32",00000000) ret=792462c3 004b:Ret KERNEL32.CreateDirectoryW() retval=00000000 ret=792462c3 ... 004b:Call KERNEL32.RaiseException(e06d7363,00000001,00000003,0033e5dc) ret=79084c0f 004b:trace:seh:raise_exception code=e06d7363 flags=1 addr=0x7b446fe6 ip=7b446fe6 tid=004b 004b:trace:seh:raise_exception info[0]=19930520 004b:trace:seh:raise_exception info[1]=0033e61c 004b:trace:seh:raise_exception info[2]=7923b608 004b:trace:seh:raise_exception eax=7b4356b1 ebx=00000000 ecx=00000000 edx=0033e5c8 esi=0033e5c8 edi=0033e590 004b:trace:seh:raise_exception ebp=0033e568 esp=0033e504 cs=330023 ds=33002b es=f7c3002b fs=f7c30063 gs=f7c3006b flags=00000212 004b:trace:seh:call_vectored_handlers calling handler at 0x791f5a7c code=e06d7363 flags=1 004b:Call KERNEL32.GetLastError() ret=791f5aa7 004b:Ret KERNEL32.GetLastError() retval=00000003 ret=791f5aa7 004b:trace:seh:call_vectored_handlers handler at 0x791f5a7c returned 0 004b:trace:seh:call_stack_handlers calling handler at 0x7923b644 code=e06d7363 flags=1 ... 004b:Call KERNEL32.FormatMessageW(000031ff,00000000,80070003,00000400,0033e620,00000000,0033e5cc) ret=7923ae16 004b:Ret KERNEL32.FormatMessageW() retval=00000010 ret=7923ae16 ... 004b:Call oleaut32.SysAllocString(001b7900 L"Error compiling mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: Path not found. (Exception from HRESULT: 0x80070003)\n") ret=7927d1d9 ... --- snip ---
https://social.msdn.microsoft.com/Forums/vstudio/en-US/099c0590-8bc3-4006-a2...
--- quote --- I know that the .NET 4.0 GAC stores its assemblies at C:\Windows\Microsoft.NET\assembly and the .NET GAC pre-4.0 assemblies are at: C:\Windows\assembly. The .NET 4.0 GAC is broken down into subdirectories:
C:\Windows\Microsoft.NET\assembly>dir Volume in drive C has no label. Volume Serial Number is 108E-C26D
Directory of C:\Windows\Microsoft.NET\assembly
09/12/2012 01:31 PM <DIR> . 09/12/2012 01:31 PM <DIR> .. 09/12/2012 01:54 PM <DIR> GAC_32 09/12/2012 01:54 PM <DIR> GAC_64 09/12/2012 01:35 PM <DIR> GAC_MSIL
GAC_32 (for 32-bit compiled assemblies) GAC_64 (for 64-bit compiled assemblies) GAC_MSIL (for assemblies compiled as "any cpu")
The earlier .NET GAC has these three subdirectories, plus one called just plain GAC i.e. C:\Windows\assembly\GAC:
C:\Windows\assembly>dir Volume in drive C has no label. Volume Serial Number is 108E-C26D
Directory of C:\Windows\assembly
09/12/2012 02:06 PM <DIR> GAC 09/12/2012 01:54 PM <DIR> GAC_32 09/12/2012 01:54 PM <DIR> GAC_64 09/12/2012 02:06 PM <DIR> GAC_MSIL 09/12/2012 02:42 PM <DIR> NativeImages_v2.0.50727_32 09/12/2012 01:48 PM <DIR> NativeImages_v2.0.50727_64 09/12/2012 02:42 PM <DIR> NativeImages_v4.0.30319_32 09/12/2012 01:48 PM <DIR> NativeImages_v4.0.30319_64 09/12/2012 02:42 PM <DIR> temp 09/12/2012 02:05 PM <DIR> tmp --- quote ---
https://blogs.msdn.microsoft.com/gauravseth/2006/03/07/moving-from-32-bit-to...
.NET GAC pre-4.0 (1.0 - 3.5) assemblies are stored in 'c:\windows\assembly' (%systemroot%\assembly)
Install from 'winetricks':
* WinVer set to 'Windows XP' (otherwise 'mscoree.dll' is not installed). * WINEDLLOVERRIDES=fusion=b wine dotNetFx40_Full_x86_x64.exe
References in Shared Source CLI 2.0:
https://github.com/fixdpt/shared-source-cli-2.0
https://github.com/fixdpt/shared-source-cli-2.0/blob/d63349c09c2e93e4bfc4c8b...
https://github.com/fixdpt/shared-source-cli-2.0/blob/d63349c09c2e93e4bfc4c8b...
https://github.com/fixdpt/shared-source-cli-2.0/search?q=FUSION_CACHE_STAGIN...
--- snip --- #define REG_KEY_FUSION_SETTINGS TEXT("Software\Microsoft\Fusion")
#define FUSION_CACHE_DIR_ROOT_SZ TEXT("\assembly") #define FUSION_CACHE_DIR_DOWNLOADED_SZ TEXT("\assembly\dl3") #define FUSION_CACHE_DIR_GAC_SZ TEXT("\GAC") #define FUSION_CACHE_DIR_GACNE_SZ TEXT("\GAC_MSIL") #define FUSION_CACHE_DIR_GAC32_SZ TEXT("\GAC_32") #define FUSION_CACHE_DIR_GAC64_SZ TEXT("\GAC_64") #define FUSION_CACHE_DIR_ZAP_SZ TEXT("\NativeImages_") #define FUSION_CACHE_DIR_ZAP_SHADOW_SZ TEXT("_shadow") #define FUSION_CACHE_STAGING_DIR_SZ TEXT("\assembly\tmp") #define FUSION_CACHE_PENDING_DEL_DIR_SZ TEXT("\assembly\temp") --- snip ---
https://github.com/fixdpt/shared-source-cli-2.0/blob/d63349c09c2e93e4bfc4c8b...
--- snip --- HRESULT SetGACDir(CACHE_FLAGS dwCacheFlags) { CCriticalSection cs(g_csSingleUse); HRESULT hr = S_OK; LPWSTR pwzDestBuffer = NULL; BOOL fLocked = FALSE; DWORD dwFlagToOr = 0; DWORD dwLen = 0;
// Validate cache flag _ASSERTE( dwCacheFlags & (CACHE_GAC_ANY | CACHE_ROOT));
// execute entire function under critical section hr = cs.Lock(); if (FAILED(hr)) { goto Exit; } ... --- snip ---
https://github.com/fixdpt/shared-source-cli-2.0/blob/d63349c09c2e93e4bfc4c8b...
I haven't figured out why the legacy assembly root directory doesn't exist after .NET Framework installation. It's not created by the runtime itself but somehow during .NET install process. Manually creating it fixes the GAC update issue.
--- snip --- $ wine cmd.exe /c "mkdir %systemroot%\assembly" $ wine "c:\windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe" update ... $ ls -1 .wine/drive_c/windows/assembly/* .wine/drive_c/windows/assembly/NativeImages_v4.0.30319_32: Accessibility index40.dat index6f.dat Microsoft.Build.Eng# Microsoft.Build.Fra# Microsoft.Build.Tas# Microsoft.Build.Uti# Microsoft.JScript Microsoft.Transacti# Microsoft.VisualBas# Microsoft.VisualC mscorlib PresentationBuildTa# PresentationCore PresentationFramewo# PresentationUI ReachFramework SMDiagnostics System System.Activities ... UIAutomationProvider UIAutomationTypes WindowsBase WindowsFormsIntegra# XamlBuildTask
.wine/drive_c/windows/assembly/temp: --- snip ---
$ sha1sum dotNetFx40_Full_x86_x64.exe 58da3d74db353aad03588cbb5cea8234166d8b99 dotNetFx40_Full_x86_x64.exe
$ du -sh dotNetFx40_Full_x86_x64.exe 49M dotNetFx40_Full_x86_x64.exe
$ wine --version wine-3.17-51-g5f4e5d9a38
Regards
https://bugs.winehq.org/show_bug.cgi?id=45930
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- URL| |https://download.microsoft. | |com/download/9/5/A/95A9616B | |-7A37-4AF6-BC36-D6EA96C8DAA | |E/dotNetFx40_Full_x86_x64.e | |xe Keywords| |dotnet, download, Installer
https://bugs.winehq.org/show_bug.cgi?id=45930
Louis Lenders xerox.xerox2000x@gmail.com changed:
What |Removed |Added ---------------------------------------------------------------------------- CC| |xerox.xerox2000x@gmail.com
--- Comment #1 from Louis Lenders xerox.xerox2000x@gmail.com --- (In reply to Anastasius Focht from comment #0)
Hello folks,
I haven't figured out why the legacy assembly root directory doesn't exist after .NET Framework installation. It's not created by the runtime itself but somehow during .NET install process.
Do I get it right that you're suggesting here that adding the creation of this dir to wine.inf is not a correct fix? If so, maybe a wine.inf patch would still be ok for Staging?
https://bugs.winehq.org/show_bug.cgi?id=45930
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- Component|-unknown |fusion
--- Comment #2 from Anastasius Focht focht@gmx.net --- Hello Louis,
--- quote --- Do I get it right that you're suggesting here that adding the creation of this dir to wine.inf is not a correct fix? If so, maybe a wine.inf patch would still be ok for Staging? --- quote ---
this directory doesn't exist on old Windows versions (Windows XP) without any .NET Frameworks installed. Newer Windows versions (Vista/7+) already ship certain versions of .NET Frameworks pre-installed "OS component":
https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/versions-a...
The MSI installer triggers the creation of this legacy GAC root path. Searching the Shared Source CLI 2.0 repository on Github I found one possible location:
https://github.com/fixdpt/shared-source-cli-2.0/blob/d63349c09c2e93e4bfc4c8b...
--- snip --- HRESULT LockCacheDir(CACHE_FLAGS dwCacheFlags, LPCWSTR pwzLockFile, HANDLE *phLock) { HRESULT hr = S_OK; DWORD dwErr = 0; HANDLE hLock = INVALID_HANDLE_VALUE; DWORD dwWaitTime = 0; DWORD dwFileFlags = 0; DWORD dwRetry = 0;
_ASSERTE(IsGacType(dwCacheFlags) || (dwCacheFlags == CACHE_DOWNLOAD)); _ASSERTE(pwzLockFile); _ASSERTE(*pwzLockFile); _ASSERTE(phLock);
if (IsGacType(dwCacheFlags)) { hr = CreateFilePathHierarchy(pwzLockFile); if (FAILED(hr)) { goto Exit; } } --- snip ---
CreateFilePathHierarchy() -> https://github.com/fixdpt/shared-source-cli-2.0/blob/d63349c09c2e93e4bfc4c8b... -> will create the GAC root folder due to lock file creation.
LockCacheDir() is called by Lock() -> https://github.com/fixdpt/shared-source-cli-2.0/blob/d63349c09c2e93e4bfc4c8b...
Lock() is member of CMutex class which is used in many places as scoped lock.
I looked again multiple times at the trace log and finally it made *click*.
--- snip --- ... 00b2:Call KERNEL32.LoadLibraryW(007a0dc0 L"C:\windows\Microsoft.NET\Framework\v4.0.30319\fusion.dll") ret=1001233c 00b2:Call PE DLL (proc=0xf7b8a830,module=0xf7b80000 L"fusion.dll",reason=WINE_PREATTACH,res=(nil)) 00b2:Ret PE DLL (proc=0xf7b8a830,module=0xf7b80000 L"fusion.dll",reason=WINE_PREATTACH,res=(nil)) retval=1 ... 00b2:Call PE DLL (proc=0xf7b8a830,module=0xf7b80000 L"fusion.dll",reason=PROCESS_ATTACH,res=(nil)) ... 00b2:Ret PE DLL (proc=0xf7b8a830,module=0xf7b80000 L"fusion.dll",reason=PROCESS_ATTACH,res=(nil)) retval=1 00b2:Ret KERNEL32.LoadLibraryW() retval=f7b80000 ret=1001233c 00b2:Call KERNEL32.GetProcAddress(f7b80000,10004a8c "CreateAssemblyCache") ret=10012384 00b2:Ret KERNEL32.GetProcAddress() retval=f7b83c58 ret=10012384 00b2:Call fusion.CreateAssemblyCache(0045f280,00000000) ret=100123b2 ... 00b2:Call KERNEL32.CreateMutexW(00000000,00000000,f7b8b080 L"__WINE_FUSION_CACHE_MUTEX__") ret=f7b8589d 00b2:Ret KERNEL32.CreateMutexW() retval=00000070 ret=f7b8589d 00b2:Ret fusion.CreateAssemblyCache() retval=00000000 ret=100123b2 --- snip ---
That's of course Wine's builtin fusion at work here.
https://source.winehq.org/git/wine.git/blob/HEAD:/dlls/fusion/asmcache.c#l41...
IAssemblyCacheImpl_InstallAssembly -> get_assembly_directory() -> create_full_path()
https://source.winehq.org/git/wine.git/blob/HEAD:/dlls/fusion/asmcache.c#l10...
The .NET CLR installer expects its own fusion implementation (CLR Fusion, see shared-source-cli-2.0) to be loaded here and do the work which creates also the legacy GAC roots/caches (for native images).
Preventing builtin from being loaded shows indeed:
--- snip --- $ WINEDLLOVERRIDES=fusion=n WINEDEBUG=+seh,+relay,+msi wine ./dotNetFx40_Full_x86_x64.exe >>log.txt 2>&1 ... 00b2:Ret PE DLL (proc=0x604a321f,module=0x604a0000 L"fusion.dll",reason=PROCESS_ATTACH,res=(nil)) retval=1 00b2:Ret KERNEL32.LoadLibraryW() retval=604a0000 ret=1001233c 00b2:Call KERNEL32.GetProcAddress(604a0000,10004a8c "CreateAssemblyCache") ret=10012384 00b2:Ret KERNEL32.GetProcAddress() retval=008b0033 ret=10012384 ... 00b2:Call KERNEL32.LoadLibraryExW(0045ef94 L"C:\windows\Microsoft.NET\Framework\v4.0.30319\clr.dll",00000000,00000008) ret=604a2b07 00b2:Call PE DLL (proc=0x790851d4,module=0x79060000 L"MSVCR100_CLR0400.dll",reason=PROCESS_ATTACH,res=(nil)) ... 00b2:Call PE DLL (proc=0x791f58f0,module=0x79140000 L"clr.dll",reason=PROCESS_ATTACH,res=(nil)) ... 00b2:Call KERNEL32.CreateFileW(00160fe0 L"C:\windows\Microsoft.NET\Framework\v4.0.30319\ISymWrapper.dll",80000000,00000005,00000000,00000003,00000080,00000000) ret=792e90be 00b2:Ret KERNEL32.CreateFileW() retval=00000070 ret=792e90be ... 00b2:Call KERNEL32.CreateDirectoryW(0045e13c L"C:\windows\assembly",00000000) ret=7927aacc 00b2:Ret KERNEL32.CreateDirectoryW() retval=00000001 ret=7927aacc 00b2:Call KERNEL32.CreateFileW(0045e384 L"C:\windows\assembly\GACLock.dat",40000000,00000000,00000000,00000002,04000104,00000000) ret=7926e15d 00b2:Ret KERNEL32.CreateFileW() retval=0000007c ret=7926e15d ... --- snip ---
Installer custom action dll 'InstallAssembly' -> fusion.CreateAssemblyCache -> clr.CreateAssemblyCache ...
There we go - legacy GAC root created as expected, triggered by GAC lock file (corresponding to source).
It fails later though:
--- snip --- ... 00b6:Call KERNEL32.CreateFileW(0045e69c L"C:\windows\Microsoft.Net\assembly\GAC_32\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a",c0000000,00000003,00000000,00000003,02200000,00000000) ret=794b1d64 00b6:Ret KERNEL32.CreateFileW() retval=00000080 ret=794b1d64 ... 00b6:Call KERNEL32.DeviceIoControl(00000080,000900a4,0016c4b0,00000174,00000000,00000000,0045d164,00000000) ret=794b1e60 00b6:fixme:ntdll:server_ioctl_file Unsupported ioctl 900a4 (device=9 access=0 func=29 method=0) 00b6:Ret KERNEL32.DeviceIoControl() retval=00000000 ret=794b1e60 00b6:Call KERNEL32.GetLastError() ret=794b1e6e 00b6:Ret KERNEL32.GetLastError() retval=00000032 ret=794b1e6e ... 0079:trace:msi:MSI_ProcessMessageVerbatim Calling UI handler 0x1004bf8a(pvContext=0x103fcd8, iMessageType=04000000, szMessage=L"Info 0.10/08/18 21:25:05 DDSet_Error: Failed to install assembly 'C:\windows\Microsoft.NET\Framework\v4.0.30319\System.EnterpriseServices.dll' because of system error: Request not supported.\r\n") ... 00b6:Call msi.MsiRecordSetStringW(00000001,00000000,0045e394 L"There is a problem with this Windows Installer package. Please refer to the setup log for more information.\r\n") ret=1002bae1 ... 0079:trace:msi:MSI_ProcessMessageVerbatim Calling UI handler 0x1004bf8a(pvContext=0x103fcd8, iMessageType=04000000, szMessage=L"Info 0.10/08/18 21:25:05 DDSet_Exit: InstallAssembly ended with return value 1603") ... 0031:err:msi:execute_script Execution of script 0 halted; action L"[C:\windows\Microsoft.NET\Framework\v4.0.30319\;C:\windows\Microsoft.NET\Framework\v4.0.30319\System.EnterpriseServices.dll;246128<=>S-1-5-21-0-0-0-1000<=>{3C3901C5-3455-3E0A-A214-0B093A5070A6}]CA_InstallAssemblyDef.3643236F_FC70_11D3_A536_0090278A1BB8" returned 1603 ... 0031:err:msi:ITERATE_Actions Execution halted, action L"InstallFinalize" returned 1603 --- snip ---
Unfortunately we run into our old friend here: bug 12401 ("NET Framework 2.0, 3.0, 4.0 installers and other apps that make use of GAC API for managed assembly installation need reparse point/junction API support, i.e. DeviceIoCtl(FSCTL_SET_REPARSE_POINT/FSCTL_GET_REPARSE_POINT)").
A workaround/compromise could be that Wine's fusion also creates the legacy GAC cache/root folder by default so that scheduled native NGEN/mscorsvc runs will succeed on all assemblies.
Regards
https://bugs.winehq.org/show_bug.cgi?id=45930
--- Comment #3 from Anastasius Focht focht@gmx.net --- Hello folks,
revisiting, still present. This is quite annoying and causes endless GAC/NGEN update loops (going for hours).
Trigger full update of GAC + legacy location for 32-bit assemblies:
--- snip --- $ wine "c:\windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe" update --- snip ---
Trigger full update of GAC + legacy location for 64-bit assemblies:
--- snip --- $ wine "c:\windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe" update --- snip ---
These finish in time with legacy GAC folder present:
--- snip --- $ tree --charset=ANSI .wine/drive_c/windows/assembly/
.wine/drive_c/windows/assembly/ |-- NativeImages_v4.0.30319_32 | |-- Accessibility | | `-- 01254caa0efc15b5cd48fb3178018701 | | `-- Accessibility.ni.dll | |-- AspNetMMCExt | | `-- 03bf63d8ea6622a32b9a3fc6851801a9 | | `-- AspNetMMCExt.ni.dll | |-- ComSvcConfig | | `-- 51819c709096229ee187a7feee395d9f | | `-- ComSvcConfig.ni.exe | |-- CustomMarshalers | | `-- d2574c8ae333ff959be2e0d83121ad10 | | `-- CustomMarshalers.ni.dll | |-- dfsvc | | `-- b9b6069e6da06eb57e89cc544397f735 | | `-- dfsvc.ni.exe | |-- index50.dat | |-- index7f.dat | |-- Microsoft.Build | | `-- 3bfb841477d28ca866b91211f50199bb | | `-- Microsoft.Build.ni.dll | |-- Microsoft.Build.Con# | | `-- 837fa037ca302e7432ea9913ae453e70 | | `-- Microsoft.Build.Conversion.v4.0.ni.dll | |-- Microsoft.Build.Eng# | | `-- 7cfd4a64a95807ee7cb6ae50cfabd93c | | `-- Microsoft.Build.Engine.ni.dll ... | |-- WsatConfig | | `-- 3c0d21e75c9a48aba6fba3ddff0fcf39 | | `-- WsatConfig.ni.exe | `-- XamlBuildTask | `-- 4daf91c66e01c3dd92b239feacaa8245 | `-- XamlBuildTask.ni.dll |-- NativeImages_v4.0.30319_64 | |-- Accessibility | | `-- dea86a81aacc28e408507e311da6d2fa | | `-- Accessibility.ni.dll | |-- AspNetMMCExt | | `-- e6714c10925019a0d1b861b815e23061 | | `-- AspNetMMCExt.ni.dll | |-- ComSvcConfig | | `-- 277ba7e739dd2581171f908cbbe0294c | | `-- ComSvcConfig.ni.exe | |-- CustomMarshalers | | `-- 484c3c0ed451c906dec30445553d8fc1 | | `-- CustomMarshalers.ni.dll | |-- dfsvc | | `-- a354197a45ffa73be93177ed5b0ce377 | | `-- dfsvc.ni.exe | |-- index7b.dat | |-- index7d.dat | |-- Microsoft.Build | | `-- 055d4ad3cccc507fe82e90951a562783 | | `-- Microsoft.Build.ni.dll ... | |-- UIAutomationProvider | | `-- 17f02848e133014dab9270423d9dc916 | | `-- UIAutomationProvider.ni.dll | |-- UIAutomationTypes | | `-- 61f2a7b20694daeb02f7de4931261fa4 | | `-- UIAutomationTypes.ni.dll | |-- WindowsBase | | `-- 38d48114cb19778e4bfdc338eb8adde2 | | `-- WindowsBase.ni.dll | |-- WindowsFormsIntegra# | | `-- 1c94b0dc0867d4028750c5efc3cb5edf | | `-- WindowsFormsIntegration.ni.dll | |-- WsatConfig | | `-- 1331bbcd0aaa52b60aaee1a01bec8053 | | `-- WsatConfig.ni.exe | `-- XamlBuildTask | `-- f143ae2f8d285b159779b98fa614c310 | `-- XamlBuildTask.ni.dll `-- temp
464 directories, 258 files --- snip ---
$ wine --version wine-4.9-216-g381c4e7b66
Regards
https://bugs.winehq.org/show_bug.cgi?id=45930
pattietreutel katyaberezyaka@gmail.com changed:
What |Removed |Added ---------------------------------------------------------------------------- CC| |katyaberezyaka@gmail.com
https://bugs.winehq.org/show_bug.cgi?id=45930
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- URL|https://download.microsoft. |https://web.archive.org/web |com/download/9/5/A/95A9616B |/20200112023052/https://dow |-7A37-4AF6-BC36-D6EA96C8DAA |nload.microsoft.com/downloa |E/dotNetFx40_Full_x86_x64.e |d/9/5/A/95A9616B-7A37-4AF6- |xe |BC36-D6EA96C8DAAE/dotNetFx4 | |0_Full_x86_x64.exe
--- Comment #4 from Anastasius Focht focht@gmx.net --- Hello folks,
revisiting, still present.
Adding stable download link via Internet Archive:
https://web.archive.org/web/20200112023052/https://download.microsoft.com/do...
$ wine --version wine-5.0
Regards
https://bugs.winehq.org/show_bug.cgi?id=45930
--- Comment #5 from Anastasius Focht focht@gmx.net --- Hello folks,
revisiting, still present.
Wait one or two minutes after running 'winetricks -q dotnet40'. Can also be immediately triggered by running 'ngen' directly after install, see my comment #0.
$ wine --version wine-6.1-187-g4f1b297a14b
Regards
https://bugs.winehq.org/show_bug.cgi?id=45930
Forest forestix@sonic.net changed:
What |Removed |Added ---------------------------------------------------------------------------- CC| |forestix@sonic.net