使用AsRandomAccessStream的UnauthorizedAccessException

时间:2014-03-11 17:31:26

标签: c# windows-8.1

我刚刚将我的项目从Win 8升级到Win 8.1,并且我试图利用SDK中的一些新功能。其中之一是新的AsRandomAccessStream扩展方法。我遇到的问题是当我使用它时,我收到了一个未经授权的访问异常。

  

异常:抓住:"无法访问MemoryStream的内部缓冲区。"   (System.UnauthorizedAccessException)A   捕获了System.UnauthorizedAccessException:" MemoryStream' s   内部缓冲区无法访问。"时间:3/11/2014 10:23:11 AM   螺纹:[4308]

BitmapImage image = new BitmapImage();
var imageStream = new MemoryStream(imageBytes as byte[]); 
image.SetSource(imageStream.AsRandomAccessStream());
  • imageBytes是一个有效的字节[]
  • imageStream是一个有效的MemoryStream
  • imageStream.Position = 0

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我今天遇到了这个问题,对我而言,它似乎是一个API错误/不一致。

在.NET 4中,对MemoryStream.GetBuffer()的调用需要使用某些构造函数(请参阅https://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer.aspx)。更具体地说,MemoryStream的缓冲区必须标记为可曝光。

现在,AsRandomAccessStream()调用MemoryStream.GetBuffer()。但是,在Win8.1中,缺少用于设置MemoryStream的公开能力的构造函数。因此,在创建MemoryStream时,请使用默认的空构造函数,然后调用Write()。

因此,我认为这应该有用。

BitmapImage image = new BitmapImage();
var imageStream = new MemoryStream();
imageStream.Write(yourdata, 0, yourdata.Length); 
image.SetSource(imageStream.AsRandomAccessStream());

答案 1 :(得分:1)

一个简单的解决方法是组合一些扩展方法。

var image = new BitmapImage();
var imageSource = imageBytes.AsBuffer().AsStream().AsRandomAccessStream();
image.SetSource(imageSource);