My friends, my life, my style - James S.F. Hsieh

1/09/2010

幾個關於 .NET Framework 4 的幾個疑惑與希望...

.NET Framework 3.5 以來, 普及率一直不是很理想, 微軟也針對關鍵性的幾個因素做改善, 一下的幾點筆記是該去研究一下 :P
  1. 大家都知道 .NET 的 Application 的啟動時間可能會很慢, JIT 是個原因之一, 利用 NGEN 來改善 Startup Performance 是微軟提供的一種解決方法, 我們是該驗證一下這個方式, 有幾篇文章可以追一下: The Performance Benefits of NGenCLR Optimizations In .NET Framework 3.5 SP1Improvements to NGen in .NET Framework 4To NGen or Not to NGen?Improving WPF applications startup timeSplash Screen To Improve WPF Application Perceived Cold Startup Performance

    我驗證的結果, WPF 的 Cold/Cool Startup time 還是很久, 即使用了 NGen 速度還是沒辦法像 native code 一樣.

  2. WPF 與 Direct3D  的 footprint 差異有多大, WPF 的記憶體使用量一直為人所詬病 (相較於MFC), 不知道 4.0 是否有改善

  3. .NET Framework 的 installer size 一向不小, 所以微軟設計了.NET Framework 4 Client Profile 還有Web Bootstrapper, 文章上描述 .NET Framework 4 Client Profile 的安裝不一定需要 Reboot 並且可以 Parallel Download and Install, 這個也是需要追一下: What's up with the "Reboot" step? , The .NET Framework 4.0 Beta 2 Installer ImprovementsWhat’s new in .NET Framework 4 Client Profile Beta 2, .NET Framework Client Profile Deployment Guide

    Installer size 已經比以前小很多了, 但是 install size 還是一樣肥的嚇人, 以 x86 為例, installer 的大小大約是 30.9 MB, 但是解壓縮加上 JIT 之後的大小需要 850 MB 左右, 這真的讓人卻步, 不過我承認 installer 縮小有助於程式在網路上散佈. 不過如果我想寫個 WPF 小軟體卻要求使用者要有 850 MB 的空間來安裝我的軟體, 應該沒有幾個使用者能夠接受.

    今天在別人的電腦嘗試安裝 Client profile 結果 installer 還是要求重新開機, 仔細觀察 MsiInstaller 的 log 發現這台電腦必須重新開機有幾個原因:
    C:\WINDOWS\system32\dfshim.dll 正在被下列處理名稱所使用中: explorer 識別碼 1920
    C:\WINDOWS\system32\mscoree.dll 正在被下列處理名稱所使用中: explorer 識別碼 1920
    C:\WINDOWS\system32\mscoree.dll 正在被下列處理名稱所使用中: iexplore 識別碼 220
    C:\WINDOWS\system32\mscoree.dll 正在被下列處理名稱所使用中: iexplore
    識別碼 1764

    這台電腦的使用者算是個很基本的 End user 所以電腦安裝的軟體並沒有什麼特別之處但是還是被要求重新開機, 原因是 IE 跟 Shell 都佔住了 .NET Framework 的 runtime, 看來狀況並不明朗啊.. 然後查了一下 MSDN 發現, Client profile 的 installer 提供 command parameter




    /norestart: Setup doesn’t reboot automatically. The chaining application needs to capture the return code and process and handle reboot if this switch is used.
    但也只是暫時讓他不需要 reboot 罷了.

    根據 张羿的文章 ".NET中的幕后英雄MSCOREE.dll " 所描述, mscoree.dll 提供了 _CorExeMain 這個進入點做為 CLR 程式啟動之用, 重點是不管哪個版本的 .NET Framework 都是用這支 DLL 來啟動, 所以 mscoree.dll 在系統中只會有兩支 (32/64bit), 而 .NET Framework 4.0 似乎需要置換掉這個檔案, 所以重新開機也許在所難免. 除非類似 SxS 的方式使用私有的 mscoree.dll, 而 张羿 似乎有找到解決的方法不過還沒分享出來, 詳細可以參考 ".NET 4.0新功能:Mscoree.dll + Mscoreei.dll=更少的Reboot"