C# 将文本格式转换为ispanable或ISpanned时,版本中出现InvalidCastException

C# 将文本格式转换为ispanable或ISpanned时,版本中出现InvalidCastException,c#,android,xamarin,xamarin.android,C#,Android,Xamarin,Xamarin.android,问题是相同的,但它似乎并没有回答为什么这个强制转换在发布模式下失败,但在调试模式下工作 Android文档规定: 返回TextView显示的文本。如果调用了setText() 如果参数为BufferType.Spanable或BufferType.EDITABLE,则 可以将此方法的返回值强制转换为可编辑或可编辑, 分别地注意:返回值的内容不应为 被改进的。如果你想要一个可修改的,你应该自己复制 首先 如果我在debug中运行以下命令,它将正常工作,在release中它将抛出一个InvalidC

问题是相同的,但它似乎并没有回答为什么这个强制转换在发布模式下失败,但在调试模式下工作

Android文档规定:

返回TextView显示的文本。如果调用了setText() 如果参数为BufferType.Spanable或BufferType.EDITABLE,则 可以将此方法的返回值强制转换为可编辑或可编辑, 分别地注意:返回值的内容不应为 被改进的。如果你想要一个可修改的,你应该自己复制 首先

如果我在debug中运行以下命令,它将正常工作,在release中它将抛出一个
InvalidCastException

var editText = FindViewById<EditText>(Resource.Id.MyEditText);
editText.SetText("hello", TextView.BufferType.Spannable);
var myTextView = FindViewById<TextView>(Resource.Id.MyTextView);

try
{
    ISpannable t21 = (ISpannable)editText.TextFormatted;
    ISpanned t22 = (ISpanned)editText.TextFormatted;
}
catch (Exception exception)
{
    myTextView.Text = exception.Message;
}

FATAL EXCEPTION: main
06-09 16:30:34.135 E/AndroidRuntime(31672): Process: App27.App27, PID: 31672
06-09 16:30:34.135 E/AndroidRuntime(31672): java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
06-09 16:30:34.135 E/AndroidRuntime(31672): Caused by: md52ce486a14f4bc06-09 16:30:34.135 E/AndroidRuntime(31672):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
06-09 16:30:34.135 E/AndroidRuntime(31672):     at dalvik.system.NativeStart.main(Native Method)
06-09 16:30:34.135 E/AndroidRuntime(31672): Caused by: java.lang.reflect.InvocationTargetException
06-09 16:30:34.135 E/AndroidRuntime(31672):     at java.lang.reflect.Method.invokeNative(Native Method)
06-09 16:30:34.135 E/AndroidRuntime(31672):     at java.lang.reflect.Method.invoke(Method.java:515)
06-09 16:30:34.135 E/AndroidRuntime(31672):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
06-09 16:30:34.135 E/AndroidRuntime(31672):     ... 2 more
06-09 16:30:34.135 E/AndroidRuntime(31672): Caused by: md52ce486a14f4bcd95899665e9d932190b.JavaProxyThrowable: System.InvalidCastException: Cannot cast from source type to destination type.
06-09 16:30:34.135 E/AndroidRuntime(31672): at App27.MainActivity.OnCreate (Android.OS.Bundle) [0x00074] in d:\Users\dbeattie\Documents\Visual Studio 2013\Projects\App27\App27\MainActivity.cs:29
06-09 16:30:34.135 E/AndroidRuntime(31672): at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (intptr,intptr,intptr) <IL 0x00013, 0x000ef>
06-09 16:30:34.135 E/AndroidRuntime(31672): at (wrapper dynamic-method) object.6917b467-8852-465b-9332-eaefa6fe6832 (intptr,intptr,intptr) <IL 0x00017, 0x00043>
var editText=findviewbyd(Resource.Id.MyEditText);
editText.SetText(“你好”,TextView.BufferType.Spanable);
var myTextView=findviewbyd(Resource.Id.myTextView);
尝试
{
ispanable t21=(ispanable)editText.TextFormatted;
ISpanned t22=(ISpanned)editText.TextFormatted;
}
捕获(异常)
{
myTextView.Text=exception.Message;
}
致命异常:主
06-09 16:30:34.135 E/AndroidRuntime(31672):进程:App27.App27,PID:31672
06-09 16:30:34.135 E/AndroidRuntime(31672):java.lang.RuntimeException:java.lang.reflect.InvocationTargetException
06-09 16:30:34.135 E/AndroidRuntime(31672):由md52ce486a14f4bc06-09 16:30:34.135 E/AndroidRuntime(31672):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
06-09 16:30:34.135 E/AndroidRuntime(31672):在dalvik.system.NativeStart.main(本机方法)
06-09 16:30:34.135 E/AndroidRuntime(31672):由以下原因引起:java.lang.reflect.InvocationTargetException
06-09 16:30:34.135 E/AndroidRuntime(31672):位于java.lang.reflect.Method.Invokenactive(本机方法)
06-09 16:30:34.135 E/AndroidRuntime(31672):位于java.lang.reflect.Method.invoke(Method.java:515)
06-09 16:30:34.135 E/AndroidRuntime(31672):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
06-09 16:30:34.135东/安德律伦time(31672):。。。还有两个
06-09 16:30:34.135 E/AndroidRuntime(31672):原因:md52ce486a14f4bcd95899665e9d932190b.JavaProxyThrowable:System.InvalidCastException:无法从源类型强制转换为目标类型。
06-09 16:30:34.135 E/AndroidRuntime(31672):位于d:\Users\dbeattie\Documents\Visual Studio 2013\Projects\App27\App27\MainActivity.cs:29中的App27.MainActivity.OnCreate(Android.OS.Bundle)[0x00074]
06-09 16:30:34.135 E/AndroidRuntime(31672):在Android.App.Activity.n_OnCreate_Landroid_os_Bundle(intptr,intptr,intptr)
06-09 16:30:34.135 E/AndroidRuntime(31672):at(包装器动态方法)对象6917b467-8852-465b-9332-eaefa6fe6832(intptr,intptr,intptr)
版本信息:

Xamarin 3.11.590.0(5160db7)Visual Studio扩展以启用 针对Xamarin.iOS和Xamarin.Android的开发

Android 5.1.3.1(d419c934e6ce2113653ff4c40214e3a5d5a69440) 支持Xamarin.Android开发的Visual Studio插件


我可以重新创建您的问题。虽然我不能给你们一个确切的解释为什么会发生这种情况,但我确实注意到了这一点。这可能是Xamarin.Android中的一个bug和/或链接器太过激进,做了一些导致InvalidCastException的事情。以下是我所做的

在我的发布配置中,我的链接器被设置为“仅SDK程序集”。无效的例外发生了。当我将链接器设置为“不链接”时,InvalidCastException没有发生。这使得它类似于调试配置,其中链接器被设置为“不链接”

因此,链接器似乎正在剥离一些需要的东西和/或一个bug是Xamarin.Android

然而,我确实找到了一个既适用于调试版又适用于发布版的解决方案。由于ispanable和ISpanned对象是java对象的java桥梁,最终将实现java.Lang.Obj,所以在转换这些对象时,我通常使用JavaCast。在转换C#对象时,我使用()或“as”关键字。在本例中,由于您正在尝试强制转换Java对象(包装器),因此正确的强制转换方法是使用JavaCast,如下所示:

var editText=findviewbyd(Resource.Id.MyEditText);
editText.SetText(“你好”,TextView.BufferType.Spanable);
var myTextView=findviewbyd(Resource.Id.myTextView);
尝试
{
ispanable t21=editText.TextFormatted.JavaCast();
ISpanned t22=editText.TextFormatted.JavaCast();
}
捕获(异常)
{
myTextView.Text=exception.Message;
}
使用此方法可用于调试和发布配置,包括将链接器设置为“不链接”和“仅SDK程序集”


不管怎样,我可能会通过提交一份关于的bug报告来让Xamarin的人知道。无论如何,我认为在这种情况下使用JavaCast(因为您正在铸造java包装器)是在这种情况下铸造的正确方式。

显然,您添加了某种跟踪,并且知道了
editText
的确切类型-使用此类信息更新帖子可能会帮助尝试回答问题的人…很好,我没有考虑尝试使用JavaCast。刚刚测试了一下,效果不错。
var editText = FindViewById<EditText>(Resource.Id.MyEditText);
editText.SetText("hello", TextView.BufferType.Spannable);
var myTextView = FindViewById<TextView>(Resource.Id.MyTextView);

try
{
    ISpannable t21 = editText.TextFormatted.JavaCast<ISpannable>();
    ISpanned t22 = editText.TextFormatted.JavaCast<ISpanned>();
}
catch (Exception exception)
{
    myTextView.Text = exception.Message;
}