방법: .NET Framework와 Windows 런타임 스트림 간의 변환(Windows에만 해당)How to: Convert between .NET Framework and Windows Runtime streams (Windows only)

UWP 앱용 .NET Framework는 전체 .NET Framework의 하위 집합입니다.The .NET Framework for UWP apps is a subset of the full .NET Framework. UWP 앱에 대한 보안과 기타 요구 사항 때문에, 전체 .NET Framework API 세트를 사용하여 파일을 열고 읽을 수는 없습니다.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. 자세한 내용은 UWP 앱용 .NET 개요를 참조하세요.For more information, see .NET for UWP apps overview. 그러나 다른 스트림 조작 작업에 대한 .NET Framework API를 사용하고 싶을 수 있습니다.However, you may want to use .NET Framework APIs for other stream manipulation operations. 이러한 스트림을 조작하려면 MemoryStream 또는 FileStream과 같은 .NET Framework 스트림 형식과 IInputStream,IOutputStream 또는 IRandomAccessStream과 같은 Windows 런타임 스트림 간에 변환하면 됩니다.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.

System.IO.WindowsRuntimeStreamExtensions 클래스는 이러한 변환을 쉽게 하는 메서드를 포함합니다.The System.IO.WindowsRuntimeStreamExtensions class contains methods that make these conversions easy. 하지만 .NET Framework와 Windows 런타임 스트림의 근본적인 차이점은 이러한 메서드를 사용한 결과에 영향을 미치며, 다음 섹션에 설명되어 있습니다.However, underlying differences between .NET Framework and Windows Runtime streams affect the results of using these methods, as described in the following sections:

Windows 런타임에서 .NET Framework 스트림으로 변환Convert from a Windows Runtime to a .NET Framework stream

Windows 런타임 스트림에서 .NET Framework 스트림으로 변환하려면 다음 System.IO.WindowsRuntimeStreamExtensions 메서드 중 하나를 사용하세요.To convert from a Windows Runtime stream to a .NET Framework stream, use one of the following System.IO.WindowsRuntimeStreamExtensions methods:

Windows 런타임은 읽기 전용, 쓰기 전용 또는 읽기 및 쓰기를 지원하는 스트림 형식을 제공합니다.The Windows Runtime offers stream types that support reading only, writing only, or reading and writing. 이러한 기능은 Windows 런타임 스트림을 .NET Framework 스트림으로 변환할 때 유지됩니다.These capabilities are maintained when you convert a Windows Runtime stream to a .NET Framework stream. 더구나 Windows 런타임 스트림을 .NET Framework 스트림으로 변환하고 그 반대로 변환하는 경우 원래 Windows 런타임 인스턴스를 다시 얻습니다.Furthermore, if you convert a Windows Runtime stream to a .NET Framework stream and back, you get the original Windows Runtime instance back.

변환하려는 Windows 런타임 스트림의 기능과 일치하는 변환 메서드를 사용하는 것이 가장 좋습니다.It’s best practice to use the conversion method that matches the capabilities of the Windows Runtime stream you want to convert. 하지만 IRandomAccessStream을 읽고 쓸 수 있으므로(IOutputStreamIInputStream 둘 다 구현함) 변환 메서드는 원본 스트림의 기능을 유지합니다.However, since IRandomAccessStream is readable and writeable (it implements both IOutputStream and IInputStream), the conversion methods maintain the capabilities of the original stream. 예를 들어 WindowsRuntimeStreamExtensions.AsStreamForRead을 사용하여 IRandomAccessStream을 변환하면 변환된 .NET Framework 스트림을 읽을 수 있도록 제한하지 않습니다.For example, using WindowsRuntimeStreamExtensions.AsStreamForRead to convert an IRandomAccessStream doesn't limit the converted .NET Framework stream to being readable. 쓰기도 가능합니다.It's also writable.

예: Windows 런타임 임의 액세스를 .NET Framework 스트림으로 변환Example: Convert Windows Runtime random-access to .NET Framework stream

Windows 런타임 임의 액세스 스트림에서 .NET Framework 스트림으로 변환하려면 WindowsRuntimeStreamExtensions.AsStream 메서드를 사용하세요.To convert from a Windows Runtime random-access stream to a .NET Framework stream, use the WindowsRuntimeStreamExtensions.AsStream method.

다음 코드 예제는 파일을 선택하라는 메시지를 표시하고 Windows 런타임 API로 파일을 연 다음, .NET Framework 스트림으로 변환합니다.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. 스트림을 읽어서 텍스트 블록으로 출력합니다.It reads the stream and outputs it to a text block. 일반적으로 결과를 출력하기 전에 .NET Framework API로 스트림을 조작합니다.You would typically manipulate the stream with .NET Framework APIs before outputting the results.

이 예제를 실행하려면, TextBlock1이라는 텍스트 블록과 Button1이라는 단추가 포함된 UWP XAML 앱을 만듭니다.To run this example, create a UWP XAML app that contains a text block named TextBlock1 and a button named Button1. 단추 클릭 이벤트를 이 예제에 표시된 button1_Click 메서드와 연결합니다.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

.NET Framework를 Windows 런타임 스트림으로 변환Convert from a .NET Framework to a Windows Runtime stream

.NET Framework 스트림에서 Windows 런타임 스트림으로 변환하려면 다음 System.IO.WindowsRuntimeStreamExtensions 메서드 중 하나를 사용하세요.To convert from a .NET Framework stream to a Windows Runtime stream, use one of the following System.IO.WindowsRuntimeStreamExtensions methods:

.NET Framework 스트림을 Windows 런타임 스트림으로 변환할 때 변환된 스트림의 기능은 원본 스트림에 따라 다릅니다.When you convert a .NET Framework stream to a Windows Runtime stream, the capabilities of the converted stream depend on the original stream. 예를 들어 원본 스트림이 읽기와 쓰기를 모두 지원하는 경우 WindowsRuntimeStreamExtensions.AsInputStream을 호출하여 스트림을 변환하면, 반환되는 형식은 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. IRandomAccessStreamIInputStreamIOutputStream을 구현하고 읽기와 쓰기를 지원합니다.IRandomAccessStream implements IInputStream and IOutputStream, and supports reading and writing.

.NET Framework 스트림은 변환 후에도 복제를 지원하지 않습니다..NET Framework streams don't support cloning, even after conversion. .NET Framework 스트림을 Windows 런타임 스트림으로 변환하고 CloneStream을 호출하는 GetInputStreamAt 또는 GetOutputStreamAt을 호출하거나 CloneStream을 직접 호출하면 예외가 발생합니다.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.

예: .NET Framework를 Windows 런타임 임의 액세스 스트림으로 변환Example: Convert .NET Framework to Windows Runtime random-access stream

.NET Framework 스트림을 Windows 런타임 임의 액세스 스트림으로 변환하려면 다음 예제와 같이 AsRandomAccessStream 메서드를 사용합니다.To convert from a .NET Framework stream to a Windows Runtime random-access stream, use the AsRandomAccessStream method, as shown in the following example:

중요

사용 중인 .NET Framework 스트림이 검색을 지원하는지 확인하고 그렇지 않으면 지원하는 스트림에 복사합니다.Make sure that the .NET Framework stream you are using supports seeking, or copy it to a stream that does. Stream.CanSeek 속성을 사용하여 이를 확인할 수 있습니다.You can use the Stream.CanSeek property to determine this.

이 예제를 실행하려면 .NET Framework 4.5.1을 대상으로 하고 TextBlock2라는 텍스트 블록과 Button2라는 단추를 포함하는 UWP XAML 앱을 만듭니다.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. 단추 클릭 이벤트를 이 예제에 표시된 button2_Click 메서드와 연결합니다.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

참조See also