调用Device.RuntimePlatform会导致运行时异常

时间:2017-04-08 13:24:14

标签: c# xamarin xamarin.forms portable-class-library

我在我的所有项目(平台+共享)中将我的Xamarin.Forms包更新到最新版本(2.3.4.224),现在我似乎不再使用Device.OSTargetPlatform枚举,因为它们已被弃用。

由于以下几行,编译器抱怨:

if (Device.OS == TargetPlatform.iOS) 
    _API_BASE_URI = "http://XXX.XXX.XXX.XXX"; 
else
    _API_BASE_URI = "http://YYY.YYY.YYY.YYY"; 

它说:

  

" Device.OS已过时。改为使用RuntimePlatform"

到目前为止一直很好,现在我想解决这个问题并且我一直在尝试使用:

Debug.WriteLine(Device.RuntimePlatform);

但它引发了运行时异常。这是堆栈跟踪

  

04-08 14:57:34.812 I / MonoDroid(3782):UNHANDLED EXCEPTION:04-08   14:57:34.824 I / MonoDroid(3782):System.TypeInitializationException:   用于' Mob.ApiCommunication'的类型初始化程序。抛出一个例外。   ---> System.MissingMethodException:Method' Xamarin.Forms.Device.get_RuntimePlatform'没找到。 04-08   14:57:34.824 I / MonoDroid(3782):---内部异常堆栈的结束   trace --- 04-08 14:57:34.824 I / MonoDroid(3782):at(包装   托管到本机)   System.Object:__ icall_wrapper_mono_generic_class_init(intptr)04-08   14:57:34.824 I / MonoDroid(3782):at   Mob.Views.Public.LoginViewModel.RestoreState   (System.Collections.Generic.IDictionary`2 [TKey,TValue]字典)   [0x00001] in   C:\用户\来源... \ LoginViewModel.cs:52   04-08 14:57:34.824 I / MonoDroid(3782):在Mob.App.OnStart()   [0x00001] in   C:\ Users ... \ App.xaml.cs:39 04-08   14:57:34.824 I / MonoDroid(3782):at   Xamarin.Forms.Application.SendStart()[0x00000] in   C:\ BuildAgent2 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Core \ Application.cs:228   04-08 14:57:34.824 I / MonoDroid(3782):at   Xamarin.Forms.Platform.Android.FormsAppCompatActivity + d__43.MoveNext   ()[0x0003b] in   C:\ BuildAgent2 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \程序兼容性\ FormsAppCompatActivity.cs:426   04-08 14:57:34.824 I / MonoDroid(3782):---堆栈跟踪结束   抛出异常的先前位置--- 04-08 14:57:34.824   I / MonoDroid(3782):at   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()   [0x0000c] in   /Users/builder/data/lanes/4468/f913a78a/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143   04-08 14:57:34.824 I / MonoDroid(3782):at   System.Runtime.CompilerServices.AsyncMethodBuilderCore.m__0   (System.Object state)[0x00000] in   /Users/builder/data/lanes/4468/f913a78a/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1018   04-08 14:57:34.824 I / MonoDroid(3782):at   Android.App.SyncContext + c__AnonStorey0。<> m__0()[0x00000] in   /Users/builder/data/lanes/4468/b16fb820/source/xamarin-android/src/Mono.Android/Android.App/SyncContext.cs:35   04-08 14:57:34.824 I / MonoDroid(3782):at   Java.Lang.Thread + RunnableImplementor.Run()[0x0000b] in   /Users/builder/data/lanes/4468/b16fb820/source/xamarin-android/src/Mono.Android/Java.Lang/Thread.cs:36   04-08 14:57:34.824 I / MonoDroid(3782):at   Java.Lang.IRunnableInvoker.n_Run(System.IntPtr jnienv,System.IntPtr   native__this)[0x00009] in   /Users/builder/data/lanes/4468/b16fb820/source/monodroid/src/Mono.Android/platforms/android-25/src/generated/Java.Lang.IRunnable.cs:81   04-08 14:57:34.824 I / MonoDroid(3782):at(包装动态方法)   System.Object:88db5e57-5ac7-4ba4-a574-4ec5eaf704fd(intptr,intptr)

我是否因使用RuntimePlatform而遗漏了什么?我环顾四周,但目前有关Device类的任何文档/示例都使用了已弃用的成员。

4 个答案:

答案 0 :(得分:4)

我出来了一个解决方案。奇怪的是,在发布SO之前,我已经为我的Xamarin项目做了这个,但它没有任何效果。但是这一次,在Xamarin论坛上阅读这个帖子之后:https://forums.xamarin.com/discussion/92455/xamarin-forms-2-3-4-224这就是我所做的:

  

我关闭了VisualStudio,清理了所有" bin" &安培; "物镜" 所有文件夹   我的解决方案中的项目,然后重新启动VS然后清理&   重建解决方案。

现在Debug.WriteLine(Device.RuntimePlatform);会返回" Android"字符串按预期!,

答案 1 :(得分:4)

Xamarin.Forms-2.3.4.224已更改条件检查:

if (Device.OS == TargetPlatform.iOS) 
{

}

要:

if (Device.RuntimePlatform.Equals("Android"))
{
    Debug.WriteLine($"Onplatform: {Device.RuntimePlatform}");
}
else if (Device.RuntimePlatform.Equals("iOS"))
{
    Debug.WriteLine($"Onplatform: {Device.RuntimePlatform}");
}

答案 2 :(得分:0)

hvaughan3对OP的评论是对我的评价。确保不仅您的PCL而且您的Android / iOS / etc项目也更新了他们的包。然后做一个完整的清理,并从那里接受OP的接受答案。

答案 3 :(得分:0)

我使用以下内容没有任何问题

MailMessage.To.Add()

看起来VS标准清洁将其关闭然后再次回答是解决方案......