Vorgehensweise: Konvertieren von .NET Framework- und Windows-Runtime-Streams (nur unter Windows)
.NET Framework für UWP-Apps ist ein Bestandteil der Vollversion des .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. Weitere Informationen finden Sie unter .NET for UWP apps overview (Übersicht zu .NET Framework für UWP-Apps). Sie können die .NET Framework-APIs jedoch für andere Streambearbeitungsvorgänge verwenden. 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 oder umgekehrt.
Die System.IO.WindowsRuntimeStreamExtensions-Klasse enthält Methoden, die diese Konvertierungen vereinfachen. 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:
Konvertieren eines Windows-Runtime-Streams in einen .NET Framework-Stream
Konvertieren Sie einen Windows-Runtime-Stream mit einer der folgenden System.IO.WindowsRuntimeStreamExtensions-Methoden in einen .NET Framework-Stream:
WindowsRuntimeStreamExtensions.AsStream konvertiert einen Random-Access-Stream in der Windows-Runtime in einen verwalteten Stream in .NET für UWP-Apps.
WindowsRuntimeStreamExtensions.AsStreamForWrite konvertiert einen Ausgabestream in der Windows-Runtime in einen verwalteten Stream in .NET für UWP-Apps.
WindowsRuntimeStreamExtensions.AsStreamForRead konvertiert einen Eingabestream in der Windows-Runtime in einen verwalteten Stream in .NET für UWP-Apps.
Für die Windows-Runtime gibt es Streamtypen, die nur das Lesen, nur das Schreiben oder Lesen und Schreiben unterstützen. Diese Funktionen bleiben erhalten, wenn Sie einen Windows-Runtime-Stream in einen .NET Framework-Stream konvertieren. 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.
Es wird empfohlen, die Konvertierungsmethode zu verwenden, die zu den Funktionen des Windows-Runtime-Streams passt, den Sie konvertieren möchten. 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. Wenn Sie beispielsweise WindowsRuntimeStreamExtensions.AsStreamForRead zum Konvertieren von IRandomAccessStream verwenden, wird der konvertierte .NET Framework-Stream nicht auf den Schreibschutz eingeschränkt. Er ist dann auch schreibbar.
Beispiel: Konvertieren eines Windows-Runtime-Streams mit wahlfreiem Zugriff in einen .NET Framework-Stream
Verwenden Sie die WindowsRuntimeStreamExtensions.AsStream-Methode, um einen Windows-Runtime-Random-Access-Stream in einen .NET Framework-Stream zu konvertieren.
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. Dabei wird der Stream gelesen und als Textblock ausgegeben. Üblicherweise sollten Sie den Stream mit .NET Framework-APIs bearbeiten, bevor die Ergebnisse ausgegeben werden.
// 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)
{
// ...
}
}
Konvertieren eines .NET Framework-Streams in einen Windows-Runtime-Stream
Konvertieren Sie einen .NET Framework-Stream mit einer der folgenden System.IO.WindowsRuntimeStreamExtensions-Methoden in einen Windows-Runtime-Stream:
WindowsRuntimeStreamExtensions.AsInputStream konvertiert einen verwalteten Stream in .NET für UWP-Apps in einen Eingabestream in der Windows-Runtime.
WindowsRuntimeStreamExtensions.AsOutputStream konvertiert einen verwalteten Stream in .NET für UWP-Apps in einen Ausgabestream in der Windows-Runtime.
Mit WindowsRuntimeStreamExtensions.AsRandomAccessStream wird ein in .NET für UWP-Apps verwalteter Stream in einen Stream mit wahlfreiem Zugriff konvertiert, den die Windows-Runtime für Lese- und Schreibvorgänge verwenden kann.
Wenn Sie einen .NET Framework-Stream in einen Windows-Runtime-Stream konvertieren, hängen die Funktionen des konvertierten Streams vom ursprünglichen Stream ab. 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
. Der IRandomAccessStream
implementiert IInputStream
und IOutputStream
und unterstützt Lese- und Schreibvorgänge.
.NET Framework-Streams unterstützen selbst nach der Konvertierung keine Klonvorgänge. 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.
Beispiel: Konvertieren eines .NET Framework-Streams in einen Windows-Runtime-Stream mit wahlfreiem Zugriff
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:
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. Um dies zu ermitteln, können Sie die Stream.CanSeek -Eigenschaft verwenden.
// 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;