私のテスト 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 アプリでは、C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE\System.dll にあるバージョン 3.5 の CF フレーバーを使用していました。
C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v2.0\ WindowsCE \System.dll からバージョン 2 の CF を使用しようとしましたが、これも失敗しました。 . 2.0)、「フレーバー」(CF 対「デラックス」/通常の System.dll)。
SO ... CF フレーバーの System.dll[s] を、Winforms テスト アプリで正常に使用されたもの、明示的に C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll にあるものに置き換えました (とにかく、C:\Windows\Microsoft.NET\Framework\v3.5 には System.dll がありません)。
上記と同じエラー メッセージは表示されなくなりましたが、関連する可能性がある (または関連しない可能性がある) 別のコンパイル エラー (エミュレーターにより多くのディスク領域を与えることができますか? ) が現在あります。
関連があるかどうかに関係なく、興味深い質問が浮かび上がります。Windows CE プロジェクトで通常の System.dll を使用すると問題が発生しますか?
System.dll の「オフカラー」バージョンへの変更を必要としたのは明らかに JSON.NET コードであったため、問題が発生する場合、または発生する可能性が高い場合、CF- はありますか? JSON.NET の準備完了 / CF 固有のバージョン? JSON.NET ソースからアセンブリの独自の CF ターゲット バージョンを作成する必要がありますか?
アップデート
JSON.NET の readme には、次のように記載されています。
Compact Framework 3.5 ビルドの場合、Json.NET 3.5 をダウンロードします。
\Json50r7\Bin\Net35 の .DLL を意味すると思いました
私はそれについて間違っていますか?
更新 2
Windows 2008 で CE を対象としたアセンブリを作成する目的で Newtonsoft.Json.Net35.sln を開こうとすると、「選択したファイルはソリューション ファイルですが、作成者によって作成されました」というメッセージが表示され、許可されません。このアプリケーションの新しいバージョンであり、開くことができません*」
また、JSON.NET read me にも次のように書かれています。
Microsoft は、Visual Studio 2010 でのコンパクト フレームワークのサポートを停止しました。
...新しいバージョンの VS2008 で開いて、CF に適した DLL を作成することもできないと思います...
更新 3
http://json.codeplex.com/releases/view/113546からのダウンロードで「コンパクト」フォルダーを探していますが、そのようなフォルダーは表示されません。
「Portable」フォルダじゃないですよね?