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:

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:

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 IOutputStreamve 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

Ayrıca bkz.