方法: .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. 詳細については、「.NET for UWP apps overview」(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. これらのストリームを操作するには、MemoryStreamFileStream などの .NET Framework ストリーム型と、IInputStreamIOutputStreamIRandomAccessStream などの 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. IRandomAccessStream では IInputStreamIOutputStream が実装されており、読み取りと書き込みがサポートされます。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