【问题标题】:UnauthorizedAccessException using AsRandomAccessStreamUnauthorizedAccessException 使用 AsRandomAccessStream
【发布时间】:2014-04-15 10:45:15
【问题描述】:

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

异常:捕获:“无法访问 MemoryStream 的内部缓冲区。” (System.UnauthorizedAccessException) 一个 System.UnauthorizedAccessException 被捕获:“MemoryStream 的 无法访问内部缓冲区。” 时间: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

有什么想法吗?

【问题讨论】:

  • 你需要那个电话吗? MemoryStream 应该已经可以很好地处理随机访问。试着把它拿出来,即。只需传入imageStream
  • 这不起作用,因为SetSource 需要一个实现IRandomAccessStream 的对象,而MemoryStream 没有实现。
  • 也许这会给你你所需要的? canbilgin.wordpress.com/2012/06/06/…
  • 我在 Win 8 中有一个解决方法,但我很好奇为什么 8.1 SDK 中引入的新扩展方法会为我抛出异常。
  • 解决方案是什么? :)

标签: c# windows-8.1


【解决方案1】:

我今天遇到了这个问题,对我来说,它显示为 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());

【讨论】:

  • 谢谢。这应该被接受为答案。这是一个很好的答案。
  • 这绝对应该是公认的答案,经过一小时试图弄清楚为什么流不可见,使用默认的空构造函数进行初始化修复了它。只是一个小提示:写完后将位置设置回0,否则它不会总是可用的。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-05-30
    • 2012-07-20
    • 2011-11-21
    • 2014-12-17
    • 1970-01-01
    • 2013-11-21
    • 2010-11-27
    • 2011-07-03
    • 1970-01-01
    相关资源
    最近更新 更多