在xamarin android app

时间:2016-01-06 20:09:36

标签: c# android xamarin xamarin.android

为了理解这个问题,我创建了一个简单的空白Xamarin Android应用程序。使用以下简单的代码,当按下按钮时,我可以让应用程序的Release版本崩溃。请注意,为了构建,我需要添加对System.Runtime.Serialization的引用:

   protected override void OnCreate(Bundle bundle)
   {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        // Get our button from the layout resource,
        // and attach an event to it
        Button button = FindViewById<Button>(Resource.Id.MyButton);

        button.Click += delegate
        {
            using (MemoryStream stream = new MemoryStream())
            {
                DateTimeOffset offset = new DateTimeOffset(DateTime.Now);
                string serializedOffset;

                var serializer = new DataContractJsonSerializer(typeof(DateTimeOffset));
                Log.Info(nameof(MainActivity), "HACKAGE:about to serialize");
                serializer.WriteObject(stream, offset);
                serializedOffset = Encoding.UTF8.GetString(stream.ToArray(), 0, (int)stream.Position);
                Log.Info(nameof(MainActivity), "HACKAGE: got serialized" + serializedOffset);
            }
            button.Text = string.Format("{0} clicks!", count++);
        };
    }
    static void ExistenceCausesCrash(string serializedObject)
    {
        DateTimeOffset resultEx;
        var serializer = new DataContractJsonSerializer(typeof(DateTimeOffset));
        byte[] serializedObjectBytes = Encoding.UTF8.GetBytes(serializedObject);
        using (var stream = new MemoryStream(serializedObjectBytes))
        {
            resultEx = (DateTimeOffset)serializer.ReadObject(stream);
        }
    }

有趣的是:如果我注释掉ExistenceCausesCrash()例程,应用程序就不会崩溃。

我正在使用:

    Microsoft Visual Studio Enterprise 2015
    Version 14.0.24720.00 Update 1
    Microsoft .NET Framework
    Version 4.6.01038

    Xamarin   4.0.0.1717 (1390b70)
    Visual Studio extension to enable development for Xamarin.iOS and Xamarin.Android.

    Xamarin.Android   6.0.0.35 (d300845)
    Visual Studio plugin to enable development for Xamarin.Android.

    Xamarin.iOS   9.3.99.33 (ea30b32)
    Visual Studio extension to enable development for Xamarin.iOS.

在我看来,当我升级到4.0.0.1717

时,这种情况就开始发生了

在logcat中,我看到:

    01-06 12:32:01.850: I/MonoDroid(18126): UNHANDLED EXCEPTION:
    01-06 12:32:01.861: I/MonoDroid(18126): System.Runtime.Serialization.InvalidDataContractException: No set method for property 'OffsetMinutes' in type 'System.Runtime.Serialization.DateTimeOffsetAdapter'.
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.DataContract+DataContractCriticalHelper.ThrowInvalidDataContractException (System.String message, System.Type type) [0x0007b] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.DataContract.ThrowInvalidDataContractException (System.String message, System.Type type) [0x00000] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.JsonFormatWriterInterpreter.WriteToJson (System.Runtime.Serialization.XmlWriterDelegator xmlWriter, System.Object obj, System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson context, System.Runtime.Serialization.ClassDataContract dataContract, System.Xml.XmlDictionaryString[] memberNames) [0x00051] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.JsonFormatWriterGenerator+CriticalHelper+<GenerateClassWriter>c__AnonStorey0.<>m__0 (System.Runtime.Serialization.XmlWriterDelegator xmlWriter, System.Object obj, System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson context, System.Runtime.Serialization.ClassDataContract dataContract, System.Xml.XmlDictionaryString[] memberNames) [0x0000b] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.JsonClassDataContract.WriteJsonValueCore (System.Runtime.Serialization.XmlWriterDelegator jsonWriter, System.Object obj, System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson context, RuntimeTypeHandle declaredTypeHandle) [0x00027] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.JsonDataContract.WriteJsonValue (System.Runtime.Serialization.XmlWriterDelegator jsonWriter, System.Object obj, System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson context, RuntimeTypeHandle declaredTypeHandle) [0x00007] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.DataContractJsonSerializer.WriteJsonValue (System.Runtime.Serialization.Json.JsonDataContract contract, System.Runtime.Serialization.XmlWriterDelegator writer, System.Object graph, System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson context, RuntimeTypeHandle declaredTypeHandle) [0x00000] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson.WriteDataContractValue (System.Runtime.Serialization.DataContract dataContract, System.Runtime.Serialization.XmlWriterDelegator xmlWriter, System.Object obj, RuntimeTypeHandle declaredTypeHandle) [0x0003d] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType (System.Runtime.Serialization.DataContract dataContract, System.Runtime.Serialization.XmlWriterDelegator xmlWriter, System.Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, System.Type declaredType) [0x0007a] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson.SerializeWithXsiTypeAtTopLevel (System.Runtime.Serialization.DataContract dataContract, System.Runtime.Serialization.XmlWriterDelegator xmlWriter, System.Object obj, RuntimeTypeHandle originalDeclaredTypeHandle, System.Type graphType) [0x00066] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalWriteObjectContent (System.Runtime.Serialization.XmlWriterDelegator writer, System.Object graph) [0x00110] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalWriteObject (System.Runtime.Serialization.XmlWriterDelegator writer, System.Object graph) [0x00008] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.XmlObjectSerializer.InternalWriteObject (System.Runtime.Serialization.XmlWriterDelegator writer, System.Object graph, System.Runtime.Serialization.DataContractResolver dataContractResolver) [0x00000] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions (System.Runtime.Serialization.XmlWriterDelegator writer, System.Object graph, System.Runtime.Serialization.DataContractResolver dataContractResolver) [0x00079] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions (System.Runtime.Serialization.XmlWriterDelegator writer, System.Object graph) [0x00000] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.DataContractJsonSerializer.WriteObject (System.Xml.XmlDictionaryWriter writer, System.Object graph) [0x0000d] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at System.Runtime.Serialization.Json.DataContractJsonSerializer.WriteObject (System.IO.Stream stream, System.Object graph) [0x00018] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at XamarinDateTimeOffsetBugApp1.MainActivity+<>c__DisplayClass1_0.<OnCreate>b__0 (System.Object <sender>, System.EventArgs <e>) [0x00030] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at Android.Views.View+IOnClickListenerImplementor.OnClick (Android.Views.View v) [0x00014] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at Android.Views.View+IOnClickListenerInvoker.n_OnClick_Landroid_view_View_ (IntPtr jnienv, IntPtr native__this, IntPtr native_v) [0x00011] in <filename unknown>:0 
    01-06 12:32:01.861: I/MonoDroid(18126):   at (wrapper dynamic-method) System.Object:0d369c4c-eddc-4ca3-ad2e-8d81a770584b (intptr,intptr,intptr)

2 个答案:

答案 0 :(得分:3)

我认为这是由于过于激进的Xamarin.Android链接。这仍然发生在Xamarin的第7周期释放中。我们遇到了同样的问题,现在通过添加

解决了这个问题
<AndroidLinkSkip>System.Runtime.Serialization</AndroidLinkSkip>
用于Release配置的Android csproj文件中的

等待Xamarin更新并正确修复此问题... 见https://bugzilla.xamarin.com/show_bug.cgi?id=37491

答案 1 :(得分:1)

您的问题在这里:

  

在'System.Runtime.Serialization.DateTimeOffsetAdapter'类型中没有属性'OffsetMinutes'的set方法。

检查您是否正在使用正确的呼叫。

如果您在进行发布版本时使用proguard,请确保不会删除导致问题的方法。

另外,请检查this post以获取其他用户报告的同一异常的答案。

相关问题