在做 .Net Compact Framework 開發的過程中,特別是訪問 Web Service 的時候,常常會遇到這樣的異常信息:“無法找到資源程序集”或"Could not find resource assembly"。比較讓人納悶的是,明明是要訪問 Web Service,跟資源程序集有什麼關系呢?為什麼會用到資源程序集呢?什麼是資源程序集呢?
被這個問題困擾了很久,現在終於解開了迷題。
這個異常信息是這樣產生的:在 .Net CF 應用程序訪問 Web Service 的時候,程序因為某種原因(如:訪問不到網絡)要拋出一個異常,而這個異常的錯誤信息要從字符串資源程序集中獲取(如:System.SR.dll),但是程序在GAC(全局程序集緩沖,在 "\Windows\" 目錄)和程序目錄(如:"\Program Files\SmartDeviceApp1")都找不到這個程序集,所以拋出了一個“無法找到資源程序集”或"Could not find resource assembly"的異常。說得直白一點,就是程序在拋出一個異常的時候,又遇到錯誤並拋出一個新的異常。所以我們看到的“無法找到資源程序集”的異常信息,並非是程序真正的錯誤信息。
有些朋友就郁悶了,我的 Windows Mobile 5.0 明明安裝了(手工復制到設備上執行並安裝或者在調試程序的時候自動安裝)System_SR_CHS.cab(中文簡體的資源程序集安裝包),所以 System.SR.dll 和 System.SR.Resources.zh-CHS.dll 這兩個程序集應該都已經被安裝到 GAC 了,怎麼程序還是找不到這兩個程序集呢?對於這個問題,很可能是 System.SR.dll 和 System.SR.Resources.zh-CHS.dll 這兩個程序集並沒有被成功安裝到 GAC。我們可以通過PC的資源管理器浏覽設備的 "\Windows\" 目錄看個究竟。如果這兩個文件是按原來的文件名(即 "System.SR.dll" 和 "System.SR.Resources.zh-CHS.dll")存放在"\Windows\"目錄,那麼證明它們沒有被成功安裝到GAC。安裝成功的話,它們的文件名應該是類似 "GAC_System.SR_v1_0_5000_0_cneutral_1.dll" 和 "GAC_System.SR.resources_v1_0_5000_0_czh-CHS_1.dll"。
現在我們知道原因了,下面就介紹如何解決它。
比較保險的做法是在智能設備項目中引用 System.SR.dll 這個程序集。在部署的時候,這個文件就會被復制到程序目錄,打包的時候文件會被包含在生成的CAB文件中。System.SR.dll 的文件大小是93.6KB,會增加不少智能設備應用程序的存儲內存空間。