【问题标题】:Calling Device.RuntimePlatform causes runtime exception调用 Device.RuntimePlatform 导致运行时异常
【发布时间】:2017-09-03 19:33:50
【问题描述】:

我在所有项目(平台+共享)中将我的 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):未处理的异常:04-08 14:57:34.824 I/MonoDroid(3782):System.TypeInitializationException: 'Mob.ApiCommunication' 的类型初始化程序引发了异常。 ---> System.MissingMethodException: 方法 'Xamarin.Forms.Device.get_RuntimePlatform' 未找到。 04-08 14:57:34.824 I/MonoDroid(3782):---内部异常堆栈结束 跟踪 --- 04-08 14:57:34.824 I/MonoDroid(3782):在(包装 托管到本地) System.Object:__icall_wrapper_mono_generic_class_init (intptr) 04-08 14:57:34.824 I/MonoDroid(3782):在 Mob.Views.Public.LoginViewModel.RestoreState (System.Collections.Generic.IDictionary`2[TKey,TValue] 字典) [0x00001] 在 C:\Users...\Source...\LoginViewModel.cs:52 04-08 14:57:34.824 I/MonoDroid(3782):在 Mob.App.OnStart() [0x00001] 在 C:\Users...\App.xaml.cs:39 04-08 14:57:34.824 I/MonoDroid(3782):在 Xamarin.Forms.Application.SendStart () [0x00000] 在 C:\BuildAgent2\work\ca3766cfc22354a1\Xamarin.Forms.Core\Application.cs:228 04-08 14:57:34.824 I/MonoDroid(3782):在 Xamarin.Forms.Platform.Android.FormsAppCompatActivity+d__43.MoveNext () [0x0003b] 在 C:\BuildAgent2\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\FormsAppCompatActivity.cs:426 04-08 14:57:34.824 I/MonoDroid(3782):---堆栈跟踪结束 之前抛出异常的位置 --- 04-08 14:57:34.824 I/MonoDroid(3782):在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] 在 /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):在 System.Runtime.CompilerServices.AsyncMethodBuilderCore.m__0 (System.Object 状态)[0x00000] 中 /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):在 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):在 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):在 Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00009] 在 /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):在(包装动态方法) System.Object:88db5e57-5ac7-4ba4-a574-4ec5eaf704fd (intptr,intptr)

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

【问题讨论】:

  • 请注意,我目前得到相同的,所以它不是你的配置。发行说明中也没有任何内容表明此更改。我将坚持使用 Device.Os,因为它在撰写本文时仍然有效
  • 使用 Xamarin Forms 版本 2.3.4.224 对我来说以下工作正常:bool isAndroid = Device.RuntimePlatform == Device.Android; 这里还有非官方文档:https://github.com/xamarin/Xamarin.Forms/pull/658
  • @hvaughan3:不幸的是还是一样。
  • 您确定您的 Android 项目使用与共享/PCL 项目相同版本的 Xamarin Forms 吗?运行 iOS 项目时是否也遇到同样的错误?
  • 是的,我确定!是的,iOS 和 Android 都出现同样的错误!

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


【解决方案1】:

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

我已经关闭了 VisualStudio,从 all 中清除了所有“bin”和“obj”文件夹 我的解决方案中的项目,然后重新启动VS,然后清理& 重建解决方案。

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

【讨论】:

  • 总是这个干净的项目。为什么他们不能自动化,难以置信
  • 很好,很高兴你找到了它。我为自己编写了一个 powershell 脚本来删除给定目录中的所有 obj 和 bin 子文件夹。必须使用它相当多。
  • 我不知道为什么它已经过时了。太奇怪了。枚举比魔术字符串好!!!
【解决方案2】:

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}");
}

【讨论】:

  • if(Device.RuntimePlatform == Device.iOS) { //iOS 的东西 } else if(Device.RuntimePlatform == Device.Android) { }
【解决方案3】:

hvaughan3 对 OP 的评论对我有帮助。确保不仅您的 PCL,而且您的 Android/iOS/etc 项目也更新了它们的包。然后按照 OP 接受的答案进行全面清理并从那里构建。

【讨论】:

    【解决方案4】:

    我使用以下没有任何问题

    if(Device.RuntimePlatform.Equals("Android")){
      //YOUR CODE
    }else if(Device.RuntimePlatform.Equals("iOS")){
      //YOUR CODE
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      相关资源
      最近更新 更多