C# 使用AsRandomAccessStream的UnauthorizedAccessException

C# 使用AsRandomAccessStream的UnauthorizedAccessException,c#,windows-8.1,C#,Windows 8.1,我刚刚将我的项目从Win8升级到Win8.1,我正在尝试利用SDK中的一些新功能。其中之一是新的AsRandomAccessStream扩展方法。我遇到的问题是,当我使用它时,会出现未经授权的访问异常 异常:捕获:“无法访问MemoryStream的内部缓冲区。” (系统.未经授权的访问例外)A 捕获System.UnauthorizedAccess异常:“MemoryStream's 无法访问内部缓冲区。”时间:2014年11月3日上午10:23:11 线程:[4308] imageByte

我刚刚将我的项目从Win8升级到Win8.1,我正在尝试利用SDK中的一些新功能。其中之一是新的
AsRandomAccessStream
扩展方法。我遇到的问题是,当我使用它时,会出现未经授权的访问异常

异常:捕获:“无法访问MemoryStream的内部缓冲区。” (系统.未经授权的访问例外)A 捕获System.UnauthorizedAccess异常:“MemoryStream's 无法访问内部缓冲区。”时间:2014年11月3日上午10:23:11 线程:[4308]

  • imageBytes是有效的字节[]
  • imageStream是有效的MemoryStream
  • imageStream.Position=0

有什么想法吗?

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

在.NET4中,对MemoryStream.GetBuffer()的调用需要使用某些构造函数(请参阅)。更具体地说,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());

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

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

你需要那个电话吗?MemoryStream应该已经可以处理随机访问了。尝试将其取出,即仅传入
imageStream
。这不起作用,因为
SetSource
需要一个实现
irandomaccesstream
的对象,而
MemoryStream
没有实现该对象。也许这会满足您的需要?我在Win 8中有一个解决方案,但我很好奇为什么8.1 SDK中引入的新扩展方法会为我抛出一个异常。解决方案是什么?:)非常感谢。这应该被接受为答案。这是一个很好的答案。这应该是公认的答案,经过一个小时的尝试,试图找出为什么流不可见,初始化使用默认的空构造函数修复它。只是一个小提示:写完后,将位置设置回0,否则它将无法始终使用。
var image = new BitmapImage();
var imageSource = imageBytes.AsBuffer().AsStream().AsRandomAccessStream();
image.SetSource(imageSource);