Procedura: Eseguire la conversione tra flussi di .NET Framework e di Windows Runtime (solo Windows)
.NET Framework per le app UWP è un subset della versione completa di .NET Framework. Per motivi di sicurezza e di altri requisiti per le app UWP, non è possibile usare l'intero set di API di .NET Framework per aprire e leggere i file. Per altre informazioni, vedere .NET for UWP apps overview (Panoramica di .NET per le app UWP). Tuttavia, è possibile usare le API di .NET Framework per altre operazioni di manipolazione di un flusso. Per modificare questi flussi, è possibile eseguire la conversione tra un tipo di flusso di .NET Framework come MemoryStream o FileStream e un flusso di Windows Runtime, come IInputStream, IOutputStream o IRandomAccessStream.
La classe System.IO.WindowsRuntimeStreamExtensions contiene metodi che semplificano queste conversioni. Tuttavia, le differenze sottostanti tra i flussi in .NET Framework e Windows Runtime hanno effetto sui risultati dell'uso di questi metodi, come descritto nelle sezioni seguenti:
Eseguire la conversione da un flusso di Windows Runtime a un flusso di .NET Framework
Per convertire un flusso di Windows Runtime in un flusso di .NET Framework, usare uno dei metodi System.IO.WindowsRuntimeStreamExtensions seguenti:
WindowsRuntimeStreamExtensions.AsStream converte un flusso ad accesso casuale di Windows Runtime in un flusso gestito di .NET per app UWP.
WindowsRuntimeStreamExtensions.AsStreamForWrite converte un flusso di output di Windows Runtime in un flusso gestito di .NET per app UWP.
WindowsRuntimeStreamExtensions.AsStreamForRead converte un flusso di input di Windows Runtime in un flusso gestito di .NET per app UWP.
Windows Runtime offre tipi di flusso che supportano solo la lettura, solo la scrittura oppure la lettura e la scrittura. Queste funzionalità vengono mantenute quando si converte un flusso di Windows Runtime in un flusso di .NET Framework. Inoltre, se un flusso di Windows Runtime viene convertito in un flusso di .NET Framework e viceversa, si ottiene l'istanza originale di Windows Runtime.
È consigliabile usare il metodo di conversione corrispondente alle funzionalità del flusso di Windows Runtime da convertire. Tuttavia, dato che IRandomAccessStream è leggibile e modificabile (implementa sia IOutputStream che IInputStream) i metodi di conversione mantengono le funzionalità del flusso originale. Ad esempio, se si usa WindowsRuntimeStreamExtensions.AsStreamForRead per convertire IRandomAccessStream, il flusso convertito di .NET Framework non viene limitato alla sola lettura, ma è accessibile anche in scrittura.
Esempio: Convertire un flusso ad accesso casuale di Windows Runtime in un flusso di .NET Framework
Per convertire un flusso ad accesso casuale di Windows Runtime in un flusso di .NET Framework, usare il metodo WindowsRuntimeStreamExtensions.AsStream.
Nell'esempio di codice seguente viene richiesto di selezionare un file, che viene poi aperto con le API di Windows Runtime e convertito in un flusso di .NET Framework. L'esempio legge il flusso e genera l'output in un blocco di testo. Il flusso viene in genere manipolato tramite le API di .NET Framework prima di restituire i risultati.
// Create a file picker.
FileOpenPicker picker = new FileOpenPicker();
picker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
picker.ViewMode = PickerViewMode.List;
picker.FileTypeFilter.Add(".txt");
// Show picker, enabling user to pick one file.
StorageFile result = await picker.PickSingleFileAsync();
if (result != null)
{
try
{
// Retrieve the stream. This method returns a IRandomAccessStreamWithContentType.
var stream = await result.OpenReadAsync();
// Convert the stream to a .NET stream using AsStream, pass to a
// StreamReader and read the stream.
using (StreamReader sr = new StreamReader(stream.AsStream()))
{
TextBlock1.Text = sr.ReadToEnd();
}
}
catch (Exception ex)
{
// ...
}
}
Eseguire la conversione da un flusso di .NET Framework a un flusso di Windows Runtime
Per convertire un flusso di .NET Framework in un flusso di Windows Runtime, usare uno dei metodi System.IO.WindowsRuntimeStreamExtensions seguenti:
WindowsRuntimeStreamExtensions.AsInputStream converte un flusso gestito di .NET per app UWP in un flusso di input di Windows Runtime.
WindowsRuntimeStreamExtensions.AsOutputStream converte un flusso gestito di .NET per app UWP in un flusso di output di Windows Runtime.
WindowsRuntimeStreamExtensions.AsRandomAccessStream converte un flusso gestito in .NET per app UWP in un flusso ad accesso casuale che può essere usato da Windows Runtime per la lettura o la scrittura.
Quando si converte un flusso di .NET Framework in un flusso di Windows Runtime, le funzionalità del flusso convertito dipendono dal flusso originale. Ad esempio, se il flusso originale supporta sia la lettura che la scrittura e si chiama WindowsRuntimeStreamExtensions.AsInputStream per convertirlo, il tipo restituito è IRandomAccessStream
. IRandomAccessStream
implementa IInputStream
e IOutputStream
e supporta lettura e scrittura.
I flussi di .NET Framework non supportano la clonazione, anche dopo la conversione. Se si converte un flusso di .NET Framework in un flusso di Windows Runtime e si chiama GetInputStreamAt o GetOutputStreamAt, che chiama CloneStream oppure si chiama CloneStream direttamente, si verifica un'eccezione.
Esempio: Convertire un flusso di .NET Framework in un flusso ad accesso casuale di Windows Runtime
Per convertire un flusso di .NET Framework in un flusso ad accesso casuale di Windows Runtime usare il metodo AsRandomAccessStream, come illustrato nell'esempio seguente:
Importante
Assicurarsi che il flusso di .NET Framework usato supporti la ricerca oppure copiarlo in un flusso che la supporti. A tale scopo, è possibile usare la proprietà Stream.CanSeek .
// Create an HttpClient and access an image as a stream.
var client = new HttpClient();
Stream stream = await client.GetStreamAsync("https://video2.skills-academy.com/en-us/dotnet/images/hub/featured-1.png");
// Create a .NET memory stream.
var memStream = new MemoryStream();
// Convert the stream to the memory stream, because a memory stream supports seeking.
await stream.CopyToAsync(memStream);
// Set the start position.
memStream.Position = 0;
// Create a new bitmap image.
var bitmap = new BitmapImage();
// Set the bitmap source to the stream, which is converted to a IRandomAccessStream.
bitmap.SetSource(memStream.AsRandomAccessStream());
// Set the image control source to the bitmap.
Image1.Source = bitmap;