UWP应用调用OpenReadAsync抛出IRandomAccessStream不支持CloneStream异常求助
解决UWP中RandomAccessStreamReference.OpenReadAsync()抛出克隆不支持异常的问题
问题原因
你碰到的这个异常我之前也遇到过——核心原因是通过MemoryStream.AsRandomAccessStream()转换得到的WinRT IRandomAccessStream实例,底层的.NET到WinRT流适配器(System.IO.NetFxToWinRtStreamAdapter)并没有实现CloneStream方法。而RandomAccessStreamReference在调用OpenReadAsync()时,必须要能克隆流来保证每次都能获取到一个独立的、可从头读取的流实例,所以直接用MemoryStream转换就触发了这个报错。
解决方案
有两种靠谱的解决方式,你可以根据自己的业务场景选择:
1. 直接使用WinRT原生的InMemoryRandomAccessStream
替换.NET的MemoryStream为WinRT原生的内存流,它天生支持克隆操作,完美适配RandomAccessStreamReference的要求:
// 创建WinRT原生内存流 var inMemoryStream = new InMemoryRandomAccessStream(); // 写入示例的16字节空数组 using (var writer = new DataWriter(inMemoryStream)) { writer.WriteBytes(new byte[16]); await writer.StoreAsync(); inMemoryStream.Seek(0); // 重置流位置到开头,确保后续读取正常 } // 现在可以安全创建引用并打开读取 var randomAccessStream = RandomAccessStreamReference.CreateFromStream(inMemoryStream); var newStream = await randomAccessStream.OpenReadAsync();
2. 将MemoryStream的数据转存到InMemoryRandomAccessStream中
如果你的业务逻辑必须先使用.NET的MemoryStream,可以把它的数据复制到WinRT原生流中再使用:
var ms = new MemoryStream(new byte[16]); var inMemoryStream = new InMemoryRandomAccessStream(); // 将MemoryStream的数据复制到WinRT流 await ms.CopyToAsync(inMemoryStream.AsStreamForWrite()); inMemoryStream.Seek(0); // 重置流位置 var randomAccessStream = RandomAccessStreamReference.CreateFromStream(inMemoryStream); var newStream = await randomAccessStream.OpenReadAsync();
额外说明
在你使用的UWP .NET Core 6.0.5环境中,.NET流和WinRT流的适配器存在一些功能限制,CloneStream就是其中之一。后续处理需要和WinRT API交互的流操作时,优先使用WinRT原生的流类型,能避开不少这类跨环境的兼容性坑。
内容的提问来源于stack exchange,提问作者Fernando
相关产品推荐
相关产品推荐

