2

同様の(同一の?)問題について説明している以前のSO質問をここで見ましたが、私の問題を満足させる答えはありませんでした。

私の環境:

MonoDevelop 3.0.3.2
インストールUUID:????????
ランタイム:
    モノ2.10.9(tarball)
    GTK 2.24.10
    GTK#(2.12.0.0)
    パッケージバージョン:210090011
Android用Monoがインストールされていません
Apple Developer Tools:
     Xcode 4.3.3(1178)
     ビルド4E3002
モノタッチ:5.2.12
ビルド情報:
    リリースID:30003002
    Gitリビジョン:7bf6ac0ca43c1b12703176ad9933c3484c05c84c-ダーティ
    ビルド日:2012-06-16 04:36:10 + 0000
    Xamarinアドイン:62ad7268d38c2ece7e00dc32960bd3bdab8fec38
オペレーティング·システム:
    Mac OS X 10.7.4
    Darwin NEWTON.local11.4.0Darwinカーネルバージョン11.4.0
        2012年4月9日月曜日19:32:15PDT
        ルート:xnu-1699.26.8〜1 / RELEASE_X86_64 x86_64

私のコード(PingとPingResponseは私自身のServiceModelライブラリのDTOです):

Ping request = new Ping { LoginInfo = new IMDSSWebService_SS.ServiceModel.ClientLoginInfo { UserName="guest", Password="guest", ClientPlatform="iOS", ClientVersion="1.5", InstanceUID="uid1"} };
var response = _appDel.ServiceClient.Send<IMDSSWebService_SS.ServiceModel.PingResponse>(request);

ServiceStackライブラリ:

ServiceStack.Common.Monotouch.dll (built from git src)
ServiceStack.Interfaces.Monotouch.dll (built from git src)
ServiceStack.Text.Monotouch (built from git src)

例外:

System.ExecutionEngineExceptionがスローされました

--aot-onlyで実行中に、メソッド'ServiceStack.Text.Json.JsonReader`1:GetParseFn()'をJITコンパイルしようとしています。

System.ExecutionEngineException:--aot-onlyで実行しているときに、メソッド'ServiceStack.Text.Json.JsonReader`1:GetParseFn()'をJITコンパイルしようとしています。

  ServiceStack.Text.Json.JsonReader.GetParseFn(System.Type type)[0x00000] in:0
  ServiceStack.Text.Json.JsonTypeSerializer.GetParseFn(System.Type type)[0x00000] in:0
  ServiceStack.Text.Common.TypeAccessor.Create(ITypeSerializerシリアライザー、ServiceStack.Text.TypeConfig typeConfig、System.Reflection.PropertyInfo propertyInfo)[0x00000]で:0
  ServiceStack.Text.Common.DeserializeType`1 [ServiceStack.Text.Json.JsonTypeSerializer] .GetParseMethod(ServiceStack.Text.TypeConfig typeConfig)[0x00000]で:0
  at ServiceStack.Text.Common.JsReader`1 [ServiceStack.Text.Json.JsonTypeSerializer] .GetParseFn [PingResponse]()[0x00000] in:0
  ServiceStack.Text.Json.JsonReader`1 [IMDSSWebService_SS.ServiceModel.PingResponse] .. cctor()[0x00000]で:0

JsConfig.RegisterForAot()を呼び出してみましたが、何も変わりませんでした。Link SDK Only、Link All、Link Noneのさまざまな順列も試しましたが、上記の例外を除いてすべて失敗したか、まったくビルドされませんでした。以下を参照してください。

シミュレータ/デバッグ-正常に動作します
シミュレーター/リリース-正常に動作します
iPhone/デバッグ-上記の例外
iPhone/リリース-ビルドすらしません。(別のSO質問を作成します)
4

1 に答える 1

4

タイプ登録関数をServiceStack.Text.Monotouch.JsConfig.csに追加しました。これにより、カスタムDTOをAOTコンパイル用に登録できます。ServiceStackメインラインへのプルリクエストがあるので、これですぐに到着するはずです。

JsConfigコードの変更

標準のC#タイプ(string、intなど)ではないすべてのResponseDTOタイプを登録する必要があります。私のPingResponseDTOにはStatusEnum列挙型が含まれているため、JIT例外をスローせずに応答を解析する前に、両方を登録する必要があります。上記のパッチを使用して、Monotouchアプリで次のように呼び出します。

JsConfig.RegisterForAot();
JsConfig.RegisterTypeForAot<PingResponse>();
JsConfig.RegisterTypeForAot<StatusEnum>();

これは、複雑なDTOにとっては非常に厄介になる可能性があります。うまくいけば、誰か(時間が許せば私はそうするでしょう)が登録されるべきあなたのDTOのすべてのタイプを発見する自動化された方法を思い付くことができますか?多分反射?

于 2012-07-09T18:17:29.283 に答える