在windows mobile中访问web service时出现以下错误:
System.Net.WebException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集
---> System.Net.Sockets.SocketException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集位于 System.Net.Sockets.Socket.ConnectNoCheck()位于 System.Net.Sockets.Socket.Connect()位于 System.Net.Connection.doConnect()位于 System.Net.Connection.connect()at WorkItem.doWork()位于 System.Threading.Timer.ring()--------------------------------------
在做 .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,会增加不少智能设备应用程序的存储内存空间。注:System.SR.dll需用WinCE CAB Manager从以下目录的System_SR_CHS_wm.cab中提取;
在:
C:/Program Files/Microsoft.NET/SDK/CompactFramework/v2.0/WindowsCE/Diagnostics 或 C:/Program Files/Microsoft Visual Studio 8/SmartDevices/SDK/CompactFramework/2.0/v2.0/WindowsCE/Diagnostics 目录下的cab文件中,可以用WinRAR解压缩出来,或者利用WinCE CAB Manager提取。但有些时候添加了System.SR.dll也还是出现一样的提示,有人在CF3.5环境下装了NETCFv35.Messages.zh-CHS.wm.cab,后错误信息才正常。