1

今天早上更新 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 项目并将第一行添加到它的 main 方法中:

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 Build -> Advanced -> 使用 SGen 分代垃圾收集器
  • iPhone Build -> Advanced -> 使用 SGen 分代垃圾收集器 -> 使用引用计数扩展。

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

4

1 回答 1

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(或更早版本),那么强名称更改(在6.2.x中)可能会导致monotouch.dll加载两个不同的 - 您将无法在它们之间转换实例。

如果一切都是从源代码重建的(没有无法重新编译的第 3 方 .dll),您是否可以尝试制作一个小样本(例如,通过减少/评论您的应用程序的部分)来准确显示发生这种情况的位置?(如果可能的话,使用源代码编辑您的问题或提交错误报告)。

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

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

于 2013-03-20T12:22:13.847 回答