Xamarin.ios 如何在MonoTouch中将本地图像的内容读入base64字符串

Xamarin.ios 如何在MonoTouch中将本地图像的内容读入base64字符串,xamarin.ios,monodevelop,Xamarin.ios,Monodevelop,我正在尝试使用base64编码将应用程序文档文件夹中存储的图像内容读入字符串。我将图像位置作为url;例如,我可以为图像设置以下url: file://localhost/var/mobile/Applications/40A88352-7F78-4085-856B-9621541774ED/Documents/tmp/photo_017.jpg 这就是我所尝试的: byte[] imgData = new WebClient().DownloadData(url); string base6

我正在尝试使用base64编码将应用程序文档文件夹中存储的图像内容读入字符串。我将图像位置作为url;例如,我可以为图像设置以下url:

file://localhost/var/mobile/Applications/40A88352-7F78-4085-856B-9621541774ED/Documents/tmp/photo_017.jpg
这就是我所尝试的:

byte[] imgData = new WebClient().DownloadData(url);
string base64Encoded = System.Convert.ToBase64String(imgData);
据我所知,这个代码应该是正确的。但是,这会导致我的monotouch应用程序在启动时崩溃,在调试器中,我看到抛出以下异常:

Mono.Debugger.Soft.VMDisconnectedException: Exception of type 'Mono.Debugger.Soft.VMDisconnectedException' was thrown.
at Mono.Debugger.Soft.Connection.SendReceive (CommandSet command_set, Int32 command, Mono.Debugger.Soft.PacketWriter packet) [0x00000] in <filename unknown>:0 
at Mono.Debugger.Soft.Connection.VM_GetVersion () [0x00000] in <filename unknown>:0 
at Mono.Debugger.Soft.Connection.Connect () [0x00000] in <filename unknown>:0 
at Mono.Debugger.Soft.VirtualMachine.connect () [0x00000] in <filename unknown>:0 
at Mono.Debugger.Soft.VirtualMachineManager.ListenInternal (System.Net.Sockets.Socket dbg_sock, System.Net.Sockets.Socket con_sock) [0x00000] in <filename unknown>:0 
Mono.Debugger.Soft.VMDisconnectedException:引发了类型为“Mono.Debugger.Soft.VMDisconnectedException”的异常。
在:0中的Mono.Debugger.Soft.Connection.SendReceive(CommandSet命令集,Int32命令,Mono.Debugger.Soft.PacketWriter数据包)[0x00000]处
在:0中的Mono.Debugger.Soft.Connection.VM_GetVersion()[0x00000]处
在0中的Mono.Debugger.Soft.Connection.Connect()[0x00000]处
位于:0中的Mono.Debugger.Soft.VirtualMachine.connect()[0x00000]
在Mono.Debugger.Soft.virtualmachineemanager.listenternal(System.Net.Sockets.Socket dbg_sock,System.Net.Sockets.Socket con_sock)[0x00000]中:0
如果我注释掉上面给出的两行代码,那么应用程序将正确启动,因此在我看来,新的WebClient()代码行导致了此异常


因此,基本上,我需要知道,我在使用WebClient时遇到的问题是否有解决方法,或者是否有其他方法可以将图像内容读入字符串,这样我就不需要使用WebClient。

如果启动时收到VMDisconnectedException,这可能意味着FinishedLaunching方法不能及时返回,iOS会杀死你的应用程序

如果需要在启动时加载该文件,请使用异步方法或线程包装代码,以允许FinishedLaunching及时返回:

byte[] imgData;
string base64Encoded;
ThreadPool.QueueUserWorkItem(delegate {
    imgData = new WebClient().DownloadData(url);
    base64Encoded = System.Convert.ToBase64String(imgData);
});
我尝试了你的代码,它可以工作,但是我建议尽可能多地使用包装器来处理本机对象

byte[] imgData;
string base64Encoded;
ThreadPool.QueueUserWorkItem(delegate {
   NSUrl imageUrl = NSUrl.FromFilename("path/file");
   NSData data = NSData.FromUrl(imageUrl);
   imgData = data.ToArray();
   base64Encoding = Convert.ToBase64String(bufferData);
});

谢谢你的回复,迪米特里斯。我确信得到的VMDisconnectedException是MonoTouch中的一个bug,因为当我删除对webClient的引用时,它就消失了,并且该代码不在FinishedLaunching中,而是在触地事件处理程序中<代码>错误CS1061:“MyTouCuff.Frase.NDATA”不包含“toRoals' < /COD>”的定义,这是我在代码中得到的。ThreadPool.QueueUserWorkItem的用途是什么?为ToArray()方法添加名称空间System.Linq。线程池用于允许FinishedLaunching方法及时返回。你现在说你的代码不在FinishedLaunching方法中,所以我想那部分是不需要的。谢谢,Dimitris。您的解决方案非常有效!:)在发布这个问题之前,我实际上尝试过使用包装器对本机对象进行包装的方法,但是在NSData对象上找不到ToArray()方法,并且很惊讶没有在那里找到它。但是,正如你提到的,名称空间系统.Linq是我所缺少的。。。我加了这个,现在它工作得很好。谢谢你在这方面的帮助!:)