奇怪的InvalidCastExceptions从NSObject到NSBundle / NSUserDefaults与mono runtime 2.10.12

时间:2013-03-20 10:49:11

标签: xamarin.ios xamarin

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

我将MonoDevelop从10天前的当前和稳定的版本更新到3.06(对不起,我不能更具体),以及Xamarin Studio到4.0.2。我一直在使用MonoDevelop,现在只打开Xamarin Studio,想知道我是否遇到了MonoDevelop错误。

我目前的MonoTouch版本是:

  

Xamarin.iOS

     

版本:6.2.1.201(企业版)

     

哈希:ed9807c

     

科:

     

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

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

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的Assemlby版本为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 Build - >一般 - >链接器选项 - >链接所有程序集
  • iPhone Build - >高级 - >使用SGen世代垃圾收集器
  • iPhone Build - >高级 - >使用SGen分代垃圾收集器 - >使用引用计数扩展名。

禁用(“使用引用计数扩展”)允许测试应用和我的真实应用运行而不会崩溃。所以问题似乎就在那里。

1 个答案:

答案 0 :(得分:2)

  

我已更新到Xamarin Studio 4.0.2和MonoDevelop 3.0.6

所以你将MonoDevelop 3.0.6更新为Xamarin Studio 4.0.2,对吧?遗憾的是,这并没有告诉我们之前/现在使用过哪个版本的MonoTouch / Xamarin.iOS。

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

你可以编辑你的问题来添加吗?

  

我的应用程序崩溃了以下InvalidCastExceptions:

您是否使用预制装配?如果有些人反对MonoTouch 6.0.x(或更早版本),那么strongname更改(在6.2.x中)可能会导致加载两个不同的monotouch.dll - 并且您将无法在两者之间转换实例它们。

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

  

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

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