Vorgehensweise: Konvertieren von .NET Framework- und Windows-Runtime-Streams (nur unter Windows)How to: Convert between .NET Framework and Windows Runtime streams (Windows only)

.NET Framework für UWP-Apps ist eine Teilmenge der Vollversion von .NET Framework.The .NET Framework for UWP apps is a subset of the full .NET Framework. Aufgrund der Sicherheitsanforderungen und anderer Anforderungen an UWP-Apps können Sie nicht alle .NET Framework-APIs zum Öffnen und Lesen von Dateien verwenden.Because of security and other requirements for UWP apps, you can't use the full set of .NET Framework APIs to open and read files. Weitere Informationen finden Sie unter .NET for UWP apps overview (Übersicht zu .NET Framework für UWP-Apps).For more information, see .NET for UWP apps overview. Sie können die .NET Framework-APIs jedoch für andere Streambearbeitungsvorgänge verwenden.However, you may want to use .NET Framework APIs for other stream manipulation operations. Zur Bearbeitung dieser Streams können Sie einen .NET Framework-Streamtyp wie MemoryStream oder FileStream in einen Windows-Runtime-Stream wie IInputStream, IOutputStream oder IRandomAccessStream konvertieren.To manipulate these streams, you can convert between a .NET Framework stream type such as MemoryStream or FileStream, and a Windows Runtime stream such as IInputStream, IOutputStream, or IRandomAccessStream.

Die System.IO.WindowsRuntimeStreamExtensions-Klasse enthält Methoden, die diese Konvertierungen vereinfachen.The System.IO.WindowsRuntimeStreamExtensions class contains methods that make these conversions easy. Es gibt jedoch grundlegende Unterschiede zwischen Streams in .NET Framework und der Windows-Runtime, die sich auf die Ergebnisse der Verwendung dieser Methoden auswirken. Dies wird in den folgenden Abschnitten erläutert:However, underlying differences between .NET Framework and Windows Runtime streams affect the results of using these methods, as described in the following sections:

Konvertieren eines Windows-Runtime-Streams in einen .NET Framework-StreamConvert from a Windows Runtime to a .NET Framework stream

Konvertieren Sie einen Windows-Runtime-Stream mit einer der folgenden System.IO.WindowsRuntimeStreamExtensions-Methoden in einen .NET Framework-Stream:To convert from a Windows Runtime stream to a .NET Framework stream, use one of the following System.IO.WindowsRuntimeStreamExtensions methods:

Für die Windows-Runtime gibt es Streamtypen, die nur das Lesen, nur das Schreiben oder Lesen und Schreiben unterstützen.The Windows Runtime offers stream types that support reading only, writing only, or reading and writing. Diese Funktionen bleiben erhalten, wenn Sie einen Windows-Runtime-Stream in einen .NET Framework-Stream konvertieren.These capabilities are maintained when you convert a Windows Runtime stream to a .NET Framework stream. Wenn Sie einen Windows-Runtime-Stream in einen .NET Framework-Stream bzw. zurück konvertieren, erhalten Sie darüber hinaus die ursprüngliche Windows-Runtime-Instanz zurück.Furthermore, if you convert a Windows Runtime stream to a .NET Framework stream and back, you get the original Windows Runtime instance back.

Es wird empfohlen, die Konvertierungsmethode zu verwenden, die zu den Funktionen des Windows-Runtime-Streams passt, den Sie konvertieren möchten.It’s best practice to use the conversion method that matches the capabilities of the Windows Runtime stream you want to convert. Da jedoch IRandomAccessStream lesbar und schreibbar ist (es werden sowohl IOutputStream als auch IInputStream implementiert), ist es egal, welche Konvertierungsmethode Sie verwenden. Die Funktionen des ursprünglichen Streams bleiben stets erhalten.However, since IRandomAccessStream is readable and writeable (it implements both IOutputStream and IInputStream), the conversion methods maintain the capabilities of the original stream. Wenn Sie beispielsweise WindowsRuntimeStreamExtensions.AsStreamForRead zum Konvertieren von IRandomAccessStream verwenden, wird der konvertierte .NET Framework-Stream nicht auf den Schreibschutz eingeschränkt.For example, using WindowsRuntimeStreamExtensions.AsStreamForRead to convert an IRandomAccessStream doesn't limit the converted .NET Framework stream to being readable. Er ist dann auch schreibbar.It's also writable.

Beispiel: Konvertieren eines Windows-Runtime-Streams mit wahlfreiem Zugriff in einen .NET Framework-StreamExample: Convert Windows Runtime random-access to .NET Framework stream

Verwenden Sie die WindowsRuntimeStreamExtensions.AsStream-Methode, um einen Windows-Runtime-Random-Access-Stream in einen .NET Framework-Stream zu konvertieren.To convert from a Windows Runtime random-access stream to a .NET Framework stream, use the WindowsRuntimeStreamExtensions.AsStream method.

Im folgenden Codebeispiel werden Sie dazu aufgefordert, eine Datei auszuwählen, die anschließend mithilfe von Windows-Runtime-APIs geöffnet und in einen .NET Framework-Stream konvertiert wird.The following code example prompts you to select a file, opens it with Windows Runtime APIs, and then converts it to a .NET Framework stream. Dabei wird der Stream gelesen und als Textblock ausgegeben.It reads the stream and outputs it to a text block. Üblicherweise sollten Sie den Stream mit .NET Framework-APIs bearbeiten, bevor die Ergebnisse ausgegeben werden.You would typically manipulate the stream with .NET Framework APIs before outputting the results.

Damit dieses Beispiel ausgeführt werden kann, müssen Sie eine XAML-App für die UWP erstellen, die den Textblock TextBlock1 und die Schaltfläche Button1 enthält.To run this example, create a UWP XAML app that contains a text block named TextBlock1 and a button named Button1. Weisen Sie das Klickereignis für die Schaltfläche der im Beispiel gezeigten button1_Click-Methode zu.Associate the button click event with the button1_Click method shown in the example.

using System;
using System.IO;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
using Windows.Storage;
using System.Net.Http;
using Windows.Storage.Pickers;

private async void button1_Click(object sender, RoutedEventArgs e)
{
    // Create a file picker.
    FileOpenPicker picker = new FileOpenPicker();

    // Set properties on the file picker such as start location and the type
    // of files to display.
    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)
        {
            TextBlock1.Text = "Error occurred reading the file. " + ex.Message;
        }
    }
    else
    {
        TextBlock1.Text = "User did not pick a file";
    }
}
Imports System.IO
Imports System.Runtime.InteropServices.WindowsRuntime
Imports Windows.UI.Xaml
Imports Windows.UI.Xaml.Controls
Imports Windows.UI.Xaml.Media.Imaging
Imports Windows.Storage
Imports System.Net.Http
Imports Windows.Storage.Pickers

Private Async Sub button1_Click(sender As Object, e As RoutedEventArgs)
    ' Create a file picker.
    Dim picker As New FileOpenPicker()

    ' Set properties on the file picker such as start location and the type of files to display.
    picker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary
    picker.ViewMode = PickerViewMode.List
    picker.FileTypeFilter.Add(".txt")

    ' Show picker that enable user to pick one file.
    Dim result As StorageFile = Await picker.PickSingleFileAsync()

    If result IsNot Nothing Then
        Try
            ' Retrieve the stream. This method returns a IRandomAccessStreamWithContentType.
            Dim stream = Await result.OpenReadAsync()

            ' Convert the stream to a .NET stream using AsStreamForRead, pass to a 
            ' StreamReader and read the stream.
            Using sr As New StreamReader(stream.AsStream())
                TextBlock1.Text = sr.ReadToEnd()
            End Using
        Catch ex As Exception
            TextBlock1.Text = "Error occurred reading the file. " + ex.Message
        End Try
    Else
        TextBlock1.Text = "User did not pick a file"
    End If
End Sub

Konvertieren eines .NET Framework-Streams in einen Windows-Runtime-StreamConvert from a .NET Framework to a Windows Runtime stream

Konvertieren Sie einen .NET Framework-Stream mit einer der folgenden System.IO.WindowsRuntimeStreamExtensions-Methoden in einen Windows-Runtime-Stream:To convert from a .NET Framework stream to a Windows Runtime stream, use one of the following System.IO.WindowsRuntimeStreamExtensions methods:

Wenn Sie einen .NET Framework-Stream in einen Windows-Runtime-Stream konvertieren, hängen die Funktionen des konvertierten Streams vom ursprünglichen Stream ab.When you convert a .NET Framework stream to a Windows Runtime stream, the capabilities of the converted stream depend on the original stream. Wenn z. B. der ursprüngliche Stream sowohl Lese- als auch Schreibvorgänge unterstützt und Sie WindowsRuntimeStreamExtensions.AsInputStream zum Konvertieren des Streams aufrufen, ist der zurückgegebene Typ ein IRandomAccessStream.For example, if the original stream supports both reading and writing, and you call WindowsRuntimeStreamExtensions.AsInputStream to convert the stream, the returned type is an IRandomAccessStream. Der IRandomAccessStream implementiert IInputStream und IOutputStream und unterstützt Lese- und Schreibvorgänge.IRandomAccessStream implements IInputStream and IOutputStream, and supports reading and writing.

.NET Framework-Streams unterstützen selbst nach der Konvertierung keine Klonvorgänge..NET Framework streams don't support cloning, even after conversion. Wenn Sie einen .NET Framework-Stream in einen Windows-Runtime-Stream konvertieren und GetInputStreamAt oder GetOutputStreamAt aufrufen, wodurch CloneStream oder CloneStream direkt aufgerufen wird, wird eine Ausnahme ausgelöst.If you convert a .NET Framework stream to a Windows Runtime stream and call GetInputStreamAt or GetOutputStreamAt, which call CloneStream, or if you call CloneStream directly, an exception occurs.

Beispiel: Konvertieren eines .NET Framework-Streams in einen Windows-Runtime-Stream mit wahlfreiem ZugriffExample: Convert .NET Framework to Windows Runtime random-access stream

Sie können wie im folgenden Beispiel gezeigt einen .NET Framework-Stream mithilfe der Methode AsRandomAccessStream in einen Windows-Runtime-Stream mit wahlfreiem Zugriff konvertieren:To convert from a .NET Framework stream to a Windows Runtime random-access stream, use the AsRandomAccessStream method, as shown in the following example:

Wichtig

Stellen Sie sicher, dass der von Ihnen verwendete .NET Framework-Stream Suchvorgänge unterstützt, oder kopieren Sie ihn in einen Stream, der dies unterstützt.Make sure that the .NET Framework stream you are using supports seeking, or copy it to a stream that does. Um dies zu ermitteln, können Sie die Stream.CanSeek -Eigenschaft verwenden.You can use the Stream.CanSeek property to determine this.

Um dieses Beispiel auszuführen, müssen Sie eine XAML-App für die UWP erstellen, die für .NET Framework 4.5.1 konzipiert ist und einen Textblock mit dem Namen TextBlock2 und eine Schaltfläche mit dem Namen Button2 enthält.To run this example, create a UWP XAML app that targets the .NET Framework 4.5.1 and contains a text block named TextBlock2 and a button named Button2. Weisen Sie das Klickereignis für die Schaltfläche der im Beispiel gezeigten button2_Click-Methode zu.Associate the button click event with the button2_Click method shown in the example.

using System;
using System.IO;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
using Windows.Storage;
using System.Net.Http;
using Windows.Storage.Pickers;

private async void button2_Click(object sender, RoutedEventArgs e)
{
    // Create an HttpClient and access an image as a stream.
    var client = new HttpClient();
    Stream stream = await client.GetStreamAsync("https://docs.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;
}
Imports System.IO
Imports System.Runtime.InteropServices.WindowsRuntime
Imports Windows.UI.Xaml
Imports Windows.UI.Xaml.Controls
Imports Windows.UI.Xaml.Media.Imaging
Imports Windows.Storage
Imports System.Net.Http
Imports Windows.Storage.Pickers

Private Async Sub button2_Click(sender As Object, e As RoutedEventArgs)


    ' Create an HttpClient and access an image as a stream.
    Dim client = New HttpClient()
    Dim stream As Stream = Await client.GetStreamAsync("https://docs.microsoft.com/en-us/dotnet/images/hub/featured-1.png")
    ' Create a .NET memory stream.
    Dim 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.
    Dim 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
End Sub

Siehe auchSee also