Delen via


Procedure: Converteren tussen .NET Framework- en Windows Runtime-streams (alleen Windows)

.NET Framework voor UWP-apps is een subset van het volledige .NET Framework. Vanwege de beveiliging en andere vereisten voor UWP-apps kunt u de volledige set .NET Framework-API's niet gebruiken om bestanden te openen en te lezen. Zie het overzicht van .NET voor UWP-apps voor meer informatie. U kunt echter .NET Framework-API's gebruiken voor andere bewerkingen voor het bewerken van stromen. Als u deze streams wilt bewerken, kunt u converteren tussen een .NET Framework-stroomtype, zoals MemoryStream of FileStream, en een Windows Runtime-stream, zoals IInputStream, IOutputStreamof IRandomAccessStream.

De System.IO.WindowsRuntimeStreamExtensions klasse bevat methoden die deze conversies eenvoudig maken. Onderliggende verschillen tussen .NET Framework- en Windows Runtime-streams zijn echter van invloed op de resultaten van het gebruik van deze methoden, zoals beschreven in de volgende secties:

Converteren van een Windows Runtime naar een .NET Framework-stream

Als u wilt converteren van een Windows Runtime-stream naar een .NET Framework-stream, gebruikt u een van de volgende System.IO.WindowsRuntimeStreamExtensions methoden:

Windows Runtime biedt stroomtypen die alleen-lezen, alleen schrijven of lezen en schrijven ondersteunen. Deze mogelijkheden blijven behouden wanneer u een Windows Runtime-stream converteert naar een .NET Framework-stream. Als u bovendien een Windows Runtime-stream converteert naar een .NET Framework-stroom en terug, krijgt u het oorspronkelijke Windows Runtime-exemplaar terug.

Het is raadzaam om de conversiemethode te gebruiken die overeenkomt met de mogelijkheden van de Windows Runtime-stream die u wilt converteren. Omdat IRandomAccessStream het echter leesbaar en schrijfbaar is (het implementeert zowel IOutputStream als IInputStream), behouden de conversiemethoden de mogelijkheden van de oorspronkelijke stream. Als u WindowsRuntimeStreamExtensions.AsStreamForRead bijvoorbeeld een IRandomAccessStream conversie wilt uitvoeren, wordt de geconverteerde .NET Framework-stream niet beperkt tot leesbaar. Het is ook beschrijfbaar.

Voorbeeld: Willekeurige toegang van Windows Runtime converteren naar .NET Framework-stream

Als u wilt converteren van een Willekeurige toegangsstroom van Windows Runtime naar een .NET Framework-stream, gebruikt u de WindowsRuntimeStreamExtensions.AsStream methode.

In het volgende codevoorbeeld wordt u gevraagd een bestand te selecteren, het te openen met Windows Runtime-API's en het vervolgens te converteren naar een .NET Framework-stream. De stream wordt gelezen en uitgevoerd naar een tekstblok. Normaal gesproken bewerkt u de stream met .NET Framework-API's voordat u de resultaten uitvoert.

// 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)
    {
        // ...
    }
}       

Converteren van een .NET Framework naar een Windows Runtime-stream

Als u wilt converteren van een .NET Framework-stream naar een Windows Runtime-stream, gebruikt u een van de volgende System.IO.WindowsRuntimeStreamExtensions methoden:

Wanneer u een .NET Framework-stream converteert naar een Windows Runtime-stream, zijn de mogelijkheden van de geconverteerde stream afhankelijk van de oorspronkelijke stream. Als de oorspronkelijke stream bijvoorbeeld zowel lezen als schrijven ondersteunt en u aanroept WindowsRuntimeStreamExtensions.AsInputStream om de stream te converteren, is het geretourneerde type een IRandomAccessStream. IRandomAccessStreamIInputStream implementeert en IOutputStreamondersteunt lezen en schrijven.

.NET Framework-streams bieden geen ondersteuning voor klonen, zelfs na conversie. Als u een .NET Framework-stream converteert naar een Windows Runtime-stream en een aanroep GetInputStreamAt of GetOutputStreamAt, welke aanroep CloneStream, of als u rechtstreeks belt CloneStream , treedt er een uitzondering op.

Voorbeeld: .NET Framework converteren naar een stream voor willekeurige toegang van Windows Runtime

Als u wilt converteren van een .NET Framework-stream naar een stream voor willekeurige toegang van Windows Runtime, gebruikt u de AsRandomAccessStream methode, zoals wordt weergegeven in het volgende voorbeeld:

Belangrijk

Zorg ervoor dat de .NET Framework-stream die u gebruikt ondersteuning biedt voor zoeken of kopieer deze naar een stream die wel doet. U kunt de Stream.CanSeek eigenschap gebruiken om dit te bepalen.

// Create an HttpClient and access an image as a stream.
var client = new HttpClient();
Stream stream = await client.GetStreamAsync("https://learn.microsoft.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;

Zie ook