如果我在设备上运行此代码,它将返回“ get it”:

if (Directory.Exists (NSBundle.MainBundle.BundlePath + "/ARCSDev")) {
                Console.WriteLine ("got it");
            } else {
                Console.WriteLine ("can't find it");
            }

这意味着该目录位于主捆绑包中。

我需要在此方法调用中使用该文件:

private void generateChart (int chartNumber, string palette)
        {
            string filePath = NSBundle.MainBundle.BundlePath + "/ARCSDev";

            Console.WriteLine("Filepath - " + filePath);

            Loader loader = new Loader (filePath);
            loader.LoadChart (Convert.ToString (chartNumber));

上面的代码可以在模拟器上正常运行,但不能在设备上运行。

当设备上发生错误时,我得到以下堆栈跟踪:

System.InvalidOperationException: Operation is not valid due to the current state of the object
  at System.Linq.Enumerable.Max[TileIndexRecord] (IEnumerable`1 source, System.Func`2 selector) [0x00000] in <filename unknown>:0
  at MyCompany.Data.Arcs.Loader.ExtractWriteableBitmap (MyCompany.Data.Arcs.Records.RGBPaletteRecord rgbPalette, Double dpi, MyCompany.Data.Arcs.Raschts.ChartIndexFile indexFile, MyCompany.Data.Arcs.Raschts.RasterChartFile chartFile) [0x00000] in /Users/me/Desktop/ARCSViewer/ARCSViewer/Loader.cs:571
  at MyCompany.Data.Arcs.Loader.GetHiResImage (MyCompany.Data.Arcs.Records.RGBPaletteRecord rgbPalette) [0x00000] in /Users/me/Desktop/ARCSViewer/ARCSViewer/Loader.cs:362
  at ARCSViewer.SecondViewController.generateChart (Int32 chartNumber, System.String palette) [0x0004e] in /Users/me/Desktop/ARCSViewer/ARCSViewer/SecondViewController.cs:118
  at ARCSViewer.SecondViewController.ViewDidAppear (Boolean animated) [0x00007] in /Users/me/Desktop/ARCSViewer/ARCSViewer/SecondViewController.cs:84
  at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38
  at ARCSViewer.Application.Main (System.String[] args) [0x00000] in /Users/me/Desktop/ARCSViewer/ARCSViewer/Main.cs:17

该目录包含UNIX可执行文件和发光文件。

谁能解释发生了什么事? 该文件肯定在正确的位置(捆绑包),因为我已经测试了检查是否与其他我知道也存在的文件一起存在的代码。

#1楼 票数:4

这可能是区分大小写的问题,模拟器不区分大小写,而设备区分大小写。 检查您的文件以查看是否以正确的大小写(即不仅是目录)访问所有文件。

#2楼 票数:4

设备上的权限与模拟器有很大的不同(受更多限制)。 在很多地方,您由于各种原因无法访问(例如,更改某些文件会破坏应用程序数字签名,这将使您的应用程序无法运行)。

另外,如果您的应用程序在存储数据的位置(和时间)方面不遵循Apple准则,则您的应用程序将被拒绝(如果您定位到应用程序商店)。

Xamarin上有一篇不错的文章 ,介绍如何使用iOS文件系统。

#3楼 票数:2 已采纳

我解决了这个问题,我的应用程序的几个部分使用如下代码:

fs = new FileStream(fileName, FileMode.Open);

我需要将FileStream()的每次出现都更改为以下内容:

fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);

由于我的文件在捆绑包中,不需要使用写操作,因此将文件流限制为仅读操作,并允许正确读取文件。

  ask by Jack Nutkins translate from so

未解决问题?本站智能推荐:

1回复

MonoTouch应用程序在Simulator中运行,但不在Device上运行

我知道这个标题有很多 SO问题,但它们看起来都很不一样。 然而,标题描述了主要症状。 我有一个MonoTouch应用程序,它在模拟器中运行得很棒。 甚至设备配置和应用程序签名过程也非常顺利。 但是,当应用程序在设备上运行时,它会立即崩溃。 我能够看到它在Application.
1回复

在设备上运行时,MonoTouch 4.2不支持System.ServiceModel.EndpointAddress()(在模拟器上运行)

我将MonoTouch 4.2.1与MonoDevelop 2.8 Beta 2和XCode 4一起使用 。 我们正在尝试通过slsvcutil代理生成器生成的类调用.Net Web服务方法。 在iPhone模拟器上测试该应用程序时,代码正在运行,我们成功连接到服务器并发送了Web服务请
2回复

在设备上运行时,MonoTouch不支持OpenAsync方法打开Web服务连接(在模拟器上工作)

我正在使用MonoTouch 4.0.7与MonoDevelop 2.8 Beta 2和XCode 4(有人知道如何获得MonoTouch 4.2版本?)。 我们试图通过slsvcutil代理生成器生成的类调用.Net Web服务方法。 在iPhone模拟器上测试应用程序时,代码正常工作
2回复

Xamarin.ios不能在真正的iOS设备上运行,但可以在Simulator上运行

我构建了一个移动应用程序。 此应用程序在iOS模拟器,Android模拟器和Android真实设备上运行良好。 但是,当我在TestFlight上发布它并将其安装在真实的iOS设备上时,此应用程序将无法运行。 我没有任何错误。 我的Spinner(激活指示器)一直在运行,我无法从HttpRespon
1回复

GetViewForHeader可在模拟器中工作,但不能在设备上工作

所以我有一个GetViewForHeader重写,它在模拟器中很好用。 当我在设备(iPad和iPhone)上调试应用程序时,未应用任何样式。 没有错误,并且绝对不会运行GetViewForHeader代码。 TitleForHeader等是。 奇!
2回复

Monotouch iOS绑定适用于iOS 6,但在iOS 5下失败

我为最新版本的Chartboost SDK创建了一个Monotouch iOS绑定。 当我在iOS 6模拟器上运行它但在iOS 5模拟器上失败时,它工作正常。 错误消息: 我已将项目的iOS构建SDK版本设置为6.1,将部署目标(最低操作系统版本)设置为4.3。 我错过了什
3回复

如何在Monotouch中获取iOS设备和版本

如何确定iPhone,iPod,iPad型号使用我的应用程序? 我希望获得如:iPhone,iPhone 3G,iPhone 3GS等输出 就像这个简单目标C的答案 : 回答我在目标C中的问题
1回复

在SplitView MonoTouch上无法显示NavigationBar

我在拆分视图上使用导航栏时遇到问题。 我希望导航栏显示在TableView的左侧视图中(请参阅图片单击此处 )。 这是我的AppDelegate: 和MasterViewController我试图以这种方式使用它