Nasıl kullanılır: .NET Framework ve Windows Çalışma Zamanı akışları arasında dönüştürme (yalnızca Windows)
.NET Framework UWP uygulamaları için uygulama, tam uygulama kümesinin bir .NET Framework. UWP uygulamalarına güvenlik ve diğer gereksinimler nedeniyle, dosyaları açmak ve okumak için .NET Framework API'lerinin tam kümelerini kullanaabilirsiniz. Daha fazla bilgi için bkz. UWP uygulamaları için .NET'e genel bakış. Ancak, diğer akış işleme işlemlerini için .NET Framework API'ları kullanmak isteyebilirsiniz. Bu akışları işlemek için, veya gibi bir .NET Framework MemoryStreamFileStreamakışı türü ile , veya gibi bir Windows Çalışma Zamanı akışı IInputStreamarasında dönüştürmeler IOutputStreamsağlayabilirsinizIRandomAccessStream.
sınıfı System.IO.WindowsRuntimeStreamExtensions , bu dönüştürmeleri kolaylaştıran yöntemler içerir. Ancak, .NET Framework ve Windows Çalışma Zamanı akışları arasındaki temel farklar, aşağıdaki bölümlerde açıklandığı gibi bu yöntemleri kullanmanın sonuçlarını etkiler:
Windows Çalışma Zamanı'.NET Framework dönüştürme
Windows Runtime akışından bir .NET Framework akışına dönüştürmek için aşağıdaki yöntemlerden birini System.IO.WindowsRuntimeStreamExtensions kullanın:
WindowsRuntimeStreamExtensions.AsStreamWindows Runtime'daki rastgele erişim akışını UWP uygulamaları için .NET'te yönetilen bir akışa dönüştürür.
WindowsRuntimeStreamExtensions.AsStreamForWriteWindows Çalışma Zamanı'Windows UWP uygulamaları için .NET'te yönetilen bir akışa dönüştürür.
WindowsRuntimeStreamExtensions.AsStreamForReadWindows Runtime'daki bir giriş akışını UWP uygulamaları için .NET'te yönetilen bir akışa dönüştürür.
Windows Çalışma Zamanı yalnızca okuma, yalnızca yazma veya okuma ve yazma desteği sunan akış türleri sunar. Bu özellikler, bir Windows Runtime akışını .NET Framework korunur. Ayrıca, bir Windows Çalışma Zamanı akışını bir .NET Framework akışına ve sonra geriye dönüştürürseniz, özgün Windows Çalışma Zamanı örneğini geri alırsınız.
Dönüştürmek istediğiniz Windows Çalışma Zamanı akışının özellikleriyle eşleşen dönüştürme yöntemini kullanmak en iyi yöntemdir. Ancak, okunabilir IRandomAccessStream ve yazılabilir olduğu için (IOutputStreamIInputStreamhem hem de uygulayan), dönüştürme yöntemleri özgün akışın özelliklerini sürdürür. Örneğin, bir WindowsRuntimeStreamExtensions.AsStreamForRead dönüştürmek için kullanmakIRandomAccessStream, dönüştürülen .NET Framework okunabilir olacak şekilde sınırlamaz. Ayrıca yazılabilir.
Örnek: Windows Çalışma Zamanı'nın rastgele erişimini .NET Framework dönüştürme
Windows Runtime rastgele erişim akışından bir .NET Framework akışına dönüştürmek için yöntemini WindowsRuntimeStreamExtensions.AsStream kullanın.
Aşağıdaki kod örneği bir dosya seçmenizi ister, dosyayı Windows Çalışma Zamanı API'leriyle açar ve ardından bir .NET Framework dönüştürür. Akışı okur ve bir metin bloğuna verir. Genellikle sonuçların çıktısını almak için .NET Framework API'lerle akışı işlersiniz.
Bu örneği çalıştırmak için adlı bir metin bloğu ve adlı bir düğme içeren bir TextBlock1
UWP XAML uygulaması oluşturun Button1
. Düğme tıklama olayı ile örnekte gösterilen button1_Click
yöntemi ilişkilendirme.
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
Bir çalışma .NET Framework çalışma Windows akışına dönüştürme
Bir .NET Framework Windows Runtime akışına dönüştürmek için aşağıdaki yöntemlerden birini System.IO.WindowsRuntimeStreamExtensions kullanın:
WindowsRuntimeStreamExtensions.AsInputStream, UWP uygulamaları için .NET'te yönetilen bir akışı Windows Çalışma Zamanı'Windows dönüştürür.
WindowsRuntimeStreamExtensions.AsOutputStream, UWP uygulamaları için .NET'te yönetilen bir akışı Windows Çalışma Zamanı'Windows dönüştürür.
WindowsRuntimeStreamExtensions.AsRandomAccessStreamUWP uygulamaları için .NET'te yönetilen bir akışı, Windows Çalışma Zamanı'nın okuma veya yazma için kullanabileceği rastgele erişimli bir akışa dönüştürür.
Bir çalışma .NET Framework bir Windows Çalışma Zamanı akışına dönüştürürken, dönüştürülen akışın özellikleri özgün akışa bağlıdır. Örneğin, özgün akış hem okuma hem de yazmayı destekliyorsa ve akışı WindowsRuntimeStreamExtensions.AsInputStream dönüştürmek için çağrısı yaptıysanız döndürülen tür bir olur IRandomAccessStream
. IRandomAccessStream
, ve IInputStream
uygulama IOutputStream
ve okuma ve yazma desteği sağlar.
.NET Framework akışlar, dönüştürmeden sonra bile kopyalamayı desteklemez. Bir çalışma zamanı .NET Framework bir Windows çalışma GetInputStreamAtGetOutputStreamAtCloneStreamCloneStream zamanı akışına dönüştürür ve veya çağrısı yaparsanız veya doğrudan çağrırsanız bir özel durum oluşur.
Örnek: .NET Framework Runtime Windows erişim akışına dönüştürme
Aşağıdaki örnekte gösterildiği .NET Framework bir Windows Runtime AsRandomAccessStream rastgele erişim akışına dönüştürmek için yöntemini kullanın:
Önemli
Kullanmakta .NET Framework akış aramayı desteklediğindan emin olun veya bunu destekleyen bir akışa kopyalayın. Bunu belirlemek için Stream.CanSeek özelliğini kullanabilirsiniz.
Bu örneği çalıştırmak için, .NET Framework 4.5.1'i TextBlock2
hedef alan ve adlı bir metin bloğu ve adlı bir düğme içeren bir UWP XAML uygulaması oluşturunButton2
. Düğme tıklama olayı ile örnekte gösterilen button2_Click
yöntemi ilişkilendirme.
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