Xamarin の「Introduction to Web Services」ドキュメントで説明されているように、slsvcutil.exe を介して WCF RIA サービス クラスのプロキシ クライアントを生成しましたが、非同期メソッドの 1 つを呼び出そうとすると、「完了」イベントが発生します。ハンドラーが呼び出されることはありません。数分後、アプリは Android エミュレーターから単純に終了します (Monotouch でも同じことが行われます)。
数日間のトラブルシューティングの後、ようやくクラッシュの原因を突き止めましたが、修正方法がわかりません。どこかの Mono のバグだと思いますが、これ以上トラブルシューティングする方法がわかりません。
生成されたプロキシには、次のように定義されたクラスがあります。
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name = "ChangeSetEntry", Namespace = "DomainServices")]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(SL5Proxy.ChangeSetEntry[]))]
public partial class ChangeSetEntry : object
{
...
}
(上記のコードは非常に単純化されています。約 12 行ありますが、上記のコードが問題の原因であると判断しました。オブジェクトには配列への参照がないことKnownTypeAttribute()
に注意してください。)ChangeSetEntry
ChangeSetEntry[]
単純にコメントアウトすると、
[System.Runtime.Serialization.KnownTypeAttribute(typeof(SL5Proxy.ChangeSetEntry[]))]
プロキシ コードからの行では、すべてが 100% 正しく動作し、非同期の "完了" ハンドラーが期待どおりに呼び出されます。slsvcutil.exe が問題のある KnownTypeAttribute() 行を生成する理由はわかりませんが、生成されます。
ChangeSetEntry
私の推測では、クラスがランタイム シリアライザーに既知の型であることを伝えると、ある種の無限再帰が作成されるということChangeSetEntry[]
です。ランタイムは既知の型を解決しようとし、戻ってきChangeSetEntry
てすべてをやり直します。
したがって、他の誰かがこの問題を見たことがあるかどうか、それが既知の問題であるかどうか、回避策があるかどうか、おそらくKnownTypeAttribute()
slsvcutil.exe からの行の生成を抑制する何らかの方法があるかどうかに興味があります