在我的测试 Winforms 应用程序中(我的目标是 .NET 3.5,以模拟 Windows CE / Compact Framework 3.5 应用程序,这是尽可能多的一线测试),我添加了一些 JSON.NET 代码来反序列化从 WebAPI 方法返回的 json:
try
{
const string uri = "http://localhost:48614/api/departments";
var webRequest = (HttpWebRequest)WebRequest.Create(uri);
var webResponse = (HttpWebResponse)webRequest.GetResponse();
if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
var reader = new StreamReader(webResponse.GetResponseStream());
string s = reader.ReadToEnd();
MessageBox.Show(string.Format("Content from HttpWebRequest is {0}", s));
var arr = JsonConvert.DeserializeObject<JArray>(s);
int i = 1;
foreach (JObject obj in arr)
{
var id = (string)obj["Id"];
var accountId = (double)obj["AccountId"];
var departmentName = (string)obj["DeptName"];
MessageBox.Show(string.Format("Object {0} in JSON array: id == {1}, accountId == {2}, deptName == {3}", i, id, accountId, departmentName));
i++;
}
}
else
{
MessageBox.Show(string.Format("Status code == {0}", webResponse.StatusCode));
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
...这在 .NET 3.5 Winforms 应用程序中运行良好,但是当我将其复制到面向 Windows CE 的应用程序时,代码无法运行,并出现以下错误:
The type 'System.ComponentModel.IBindingList' is defined in an assembly that is not referenced. You must add a reference to assembly 'System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
The type 'System.ComponentModel.ITypedList' is defined in an assembly that is not referenced. You must add a reference to assembly 'System, Version=2.0.0.0...
The type 'System.ComponentModel.INotifyPropertyChanging' is defined in an assembly that is not referenced....
The type 'System.ComponentModel.ICustomTypeDescriptor' is defined in an assembly...
The type 'System.ComponentModel.INotifyPropertyChanged' ...
The type 'System.Uri'...
我在 Winforms(测试平台)应用程序中看到,我使用的是 2.0.0.0 版的“常规”(或“豪华”,与 CF 相比)System.dll。不过,在 Windows CE 应用程序中,我使用的是 3.5 版的 CF 风格,可在此处找到:C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE\System.dll
我尝试使用来自 C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.dll 的版本 2 CF,但这也失败了 - 所以它显然不是真正的版本(3.5 vs . 2.0),但“风味”(CF vs “豪华”/regular System.dll)。
所以...我用 Winforms 测试应用程序成功使用的那个替换了 CF 风格的 System.dll[s],明确地是 C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll 中的那个(无论如何,我在 C:\Windows\Microsoft.NET\Framework\v3.5 中没有 System.dll)。
它不再提供与上面列出的相同的错误消息,但现在还有另一个可能(或可能不)相关的编译错误(我可以给模拟器更多的磁盘空间吗?)。
无论是否(相关),它都提出了一个有趣的问题:在 Windows CE 项目中使用常规 System.dll 会导致问题吗?
如果它会 - 或者很有可能会 - 导致问题,因为显然是 JSON.NET 代码需要更改为 System.dll 的“非彩色”版本,是否存在 CF-准备好/CF 特定版本的 JSON.NET?我是否必须从 JSON.NET 源创建自己的面向 CF 的程序集版本?
更新
在 JSON.NET 自述文件中,它指出:
对于 Compact Framework 3.5 构建下载 Json.NET 3.5。
我认为这意味着 \Json50r7\Bin\Net35 中的 .DLL
我错了吗?
更新 2
当我尝试在 Windows 2008 中打开 Newtonsoft.Json.Net35.sln 以创建面向 CE 的程序集时,它不允许我说:“所选文件是解决方案文件,但由此应用程序的较新版本,无法打开*"
它还在 JSON.NET 中说:
Microsoft 在 Visual Studio 2010 中停止了对 Compact Framework 的支持。
...所以我认为我不能在较新版本的 VS2008 中打开它并创建一个对 CF 友好的 DLL,要么...
更新 3
在http://json.codeplex.com/releases/view/113546的下载中寻找“Compact”文件夹,但我没有看到这样的文件夹:
这不是“便携式”文件夹,是吗?