在做 .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,会增加不少智能设备应用程序的存储内存空间。
新闻热点
疑难解答
图片精选