Xamarin.ios mono runtime 2.10.12中从NSObject到NSBundle/NSUserDefaults的奇怪InvalidCastException异常

Xamarin.ios mono runtime 2.10.12中从NSObject到NSBundle/NSUserDefaults的奇怪InvalidCastException异常,xamarin.ios,xamarin,Xamarin.ios,Xamarin,今天早上更新Xamarin/Monotouch后,我似乎遇到了一些问题 10天前,我将MonoDevelop从最新和稳定的版本升级到了3.06(很抱歉,我不能更具体地说),并将Xamarin Studio升级到了4.0.2。我一直在独家使用MonoDevelop,现在才打开Xamarin Studio,不知道是否遇到了MonoDevelop bug 我目前的MonoTouch版本是: 沙马林 版本:6.2.1.201(企业版) 哈希:ed9807c 分支机构: 建造日期:2013-19-03 1

今天早上更新Xamarin/Monotouch后,我似乎遇到了一些问题

10天前,我将MonoDevelop从最新和稳定的版本升级到了3.06(很抱歉,我不能更具体地说),并将Xamarin Studio升级到了4.0.2。我一直在独家使用MonoDevelop,现在才打开Xamarin Studio,不知道是否遇到了MonoDevelop bug

我目前的MonoTouch版本是:

沙马林

版本:6.2.1.201(企业版)

哈希:ed9807c

分支机构:

建造日期:2013-19-03 13:42:59-0400

在任一IDE中,在模拟器中以发布或调试模式运行我的应用程序时,我的应用程序崩溃,出现以下InvalidCastException:

System.InvalidCastException: Unable to cast object of type 'MonoTouch.Foundation.NSObject' to type 'MonoTouch.Foundation.NSUserDefaults'.

System.InvalidCastException: Unable to cast object of type 'MonoTouch.Foundation.NSObject' to type 'MonoTouch.Foundation.NSBundle'
这些并不是我期望失败的类型:-)

在任何情况下,当从Xamarin Studio或MonoDevelop构建和安装时,该应用程序都能在配备iOS 6.1.2的iPhone 4上正确编译、传输和运行

我已经将运行时目标设置为2.10.12、2.10.11和2.10.9(通过菜单中的这个新的运行时目标菜单选项,即使它没有效果),并且每次应用程序都以同样的方式崩溃

这都是更新前正常工作的代码(上周,在我去冰岛度假之前,我不在的时候没有人碰任何东西)

我们不使用任何第三方程序集;我已经清理并重建了所有的组件,但这没有帮助。我将尝试用一个小的测试解决方案来缩小问题的范围

更新1: 查看MonoDevelop中程序集的版本号,我发现:

Assembly Version 2.0.5.0, found in /Developer/MonoTouch/usr/lib/mono/2.1
Monotouch的Assemby版本为0.0.0.0

我创建了一个新的MonoTouch项目,并在其主要方法中添加了第一条有问题的行:

public class Application
{
    static void Main (string[] args)
    {
        // My real App crashes on this line with an InvalidCastException:
        string s = NSUserDefaults.StandardUserDefaults.StringForKey("Login");

        UIApplication.Main (args, null, "AppDelegate");
    }
}
这很好

更新2: 在更改测试应用程序的构建选项以匹配真实应用程序中的构建选项后,我得到了相同的崩溃。我们拥有的构建选项有:

  • iPhone构建->常规->链接器选项->链接所有程序集
  • iPhone构建->高级->使用SGen代垃圾收集器
  • iPhone构建->高级->使用SGen代垃圾收集器->使用引用计数扩展
禁用(“使用引用计数扩展”)允许测试应用程序和我的真实应用程序在不崩溃的情况下运行。所以问题似乎就在那里

我已经更新到Xamarin Studio 4.0.2和MonoDevelop 3.0.6

所以你把MonoDevelop3.0.6升级到了Xamarin Studio 4.0.2,对吗?遗憾的是,这并没有告诉我们以前/现在使用了哪个版本的MonoTouch/Xamarin.iOS

获取确切版本信息的最简单方法是使用“Xamarin Studio”菜单、“关于Xamarin Studio”项、“显示详细信息”按钮并复制/粘贴版本信息(您可以使用“复制信息”按钮)

你能编辑你的问题来添加这个吗

我的应用程序因以下InvalidCastException而崩溃:

System.InvalidCastException: Unable to cast object of type 'MonoTouch.Foundation.NSObject' to type 'MonoTouch.Foundation.NSUserDefaults'.

System.InvalidCastException: Unable to cast object of type 'MonoTouch.Foundation.NSObject' to type 'MonoTouch.Foundation.NSBundle'
您是否使用预构建的部件?如果有些人反对MonoTouch 6.0.x(或更早版本),那么更改(在6.2.x中)可能会导致加载两个不同的
MonoTouch.dll
,并且您将无法在它们之间强制转换实例

如果所有内容都是从源代码重建的(没有第三方.dll无法重新编译),您是否可以尝试制作一个小样本(例如,通过减少/注释应用程序的部分)来准确显示发生这种情况的位置?(如果可能,请使用源或文件a编辑您的问题)

我已经将运行时目标设置为2.10.12、2.10.11和2.10.9

安装的系统mono是运行Xamarin Studio和一些工具的必要条件。但是,Xamarin.iOS构建的应用程序不依赖于安装的系统。IOW Xamarin.iOS附带了自己的运行时和SDK库(例如程序集)