Hi Malte, > I unpacked that dotnetfx40.exe with 7-zip into %SOFTWARE%\dotnet4\ which > extracts among other things the "real" setup.exe. That one I then call as: > %SOFTWARE%\dotnet4\setup.exe /q /norestart /x86 /x64 > This not only saves a little time for the initial extraction phase which is > now only performed once instead of once for every client, but ... [contd] I did that extraction for .NET runtime 3.5 but I think it does not make a major difference. On the other hand it will also increase network traffic. Extracted .NET 4.0 Client framework is about 200MB in size while the installer is just about 50MB. Usually CPU resources on client is not an issue but saving network bandwidth might be more important. > ...also prevents additional downloads AFAIK, although I must admit I haven't > verified this recently. Anyway, we still have some older machines where this > command takes more than an hour, so I needed to raise the timeout to 7200 > secs. I am not sure about this. I think it might also be related to download of localization packs which are not included in offline installer. For .NET 3.5 I've used the /lang:ENU switch to prevent downloading any other language packs which I thought removed the installation time tremendously. Hmm, just notice I did not add this switch to .NET 4.0, maybe I have to try (or I tried already and it did not work for .NET 4.0). > I'd say most of this performance nightmare is due to the lovely combination of > the setup creating quite alot of DLLs and the virus scanner getting nervous > about that. I don't think this is a major issue. I have seen this happening even when no antivirus was yet installed (initial system setup). Moreover antivirus is usually limited by disk bandwidth or CPU and the installer seems to "pause" for a while at no CPU or disk activity. Although after installation of .NET it will typically run ngen to re-build all classes which is really PITA design. I think this is also one of the reasons all .NET updates received via Windows Update often take ages to install. Actually I've even prepared a script which allows me to run queued items (ngen) in order to run it before I ship machines to customers - so it won't run in the background for hours. See listing at the end of this message. Another issue is that some applications contain a LOT of components and Windows installer seems to be pretty slow at processing them. Mainly I've noticed this during OpenOffice.org/LibreOffice deployment where on many machines it takes ~30 minutes to install it. Removing unused help and language pack components allowed me to reduce LibreOffice installation time to about 2 minutes (where it takes about 20 on this machine with default feature set). Also see my documentation of my LibreOffice deployment here: <http://wpkg.org/LibreOffice#LibreOffice_3.5.x> But this is getting OT as .NET does not have components to be excluded as far as I know. br, Rainer ===== @echo off :: This script executes queued .NET items like runtime optimization and queued :: re-compilation. :: Exit code. set EXIT_CODE=0 setlocal enabledelayedexpansion echo Executing queued items. if not exist "%SystemRoot%\Microsoft.NET\Framework" goto skip32bit :: start ".NET Framework %%I 32-bit queued items" for /f %%I IN ('dir /O:-N /b "%SystemRoot%\Microsoft.NET\Framework\v*"') DO ( if exist "%SystemRoot%\Microsoft.NET\Framework\%%I\ngen.exe" ( echo. echo. echo. echo. echo ####################################################################### echo Executing delayed tasks for version %%I 32-bit echo ####################################################################### echo. echo. "%SystemRoot%\Microsoft.NET\Framework\%%I\ngen.exe" executeQueuedItems /nologo /silent if !ERRORLEVEL! GTR !EXIT_CODE! set EXIT_CODE=!ERRORLEVEL! ) ) :skip32bit if not exist "%SystemRoot%\Microsoft.NET\Framework64" goto skip64bit :: start ".NET Framework %%I 64-bit queued items" for /f %%I IN ('dir /O:-N /b "%SystemRoot%\Microsoft.NET\Framework64\v*"') DO ( if exist "%SystemRoot%\Microsoft.NET\Framework64\%%I\ngen.exe" ( echo. echo. echo. echo. echo ####################################################################### echo Executing delayed tasks for version %%I 64-bit echo ####################################################################### echo. echo. "%SystemRoot%\Microsoft.NET\Framework64\%%I\ngen.exe" executeQueuedItems /nologo /silent if !ERRORLEVEL! GTR !EXIT_CODE! set EXIT_CODE=!ERRORLEVEL! ) ) :skip64bit endlocal pause exit /b %EXIT_CODE% ===== |