Nasıl yapılır: .NET Framework ile Windows Çalışma Zamanı akışları arasında dönüştürme (yalnızca Windows)
UWP uygulamaları için .NET Framework, tam .NET Framework'ün bir alt kümesidir. UWP uygulamalarının güvenlik ve diğer gereksinimleri nedeniyle dosyaları açmak ve okumak için .NET Framework API'lerinin tamamını kullanamazsınız. 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 MemoryStreamFileStreambir .NET Framework akış türü ile , veya IRandomAccessStreamgibi IInputStreamIOutputStreambir Windows Çalışma Zamanı akışı arasında dönüştürme yapabilirsiniz.
sınıfı, System.IO.WindowsRuntimeStreamExtensions bu dönüştürmeleri kolaylaştıran yöntemler içerir. Ancak, .NET Framework ile Windows Çalışma Zamanı akışları arasındaki temel farklılıklar, aşağıdaki bölümlerde açıklandığı gibi bu yöntemlerin kullanılmasının sonuçlarını etkiler:
bir Windows Çalışma Zamanı .NET Framework akışına dönüştürme
Windows Çalışma Zamanı akışından .NET Framework akışına dönüştürmek için aşağıdaki System.IO.WindowsRuntimeStreamExtensions yöntemlerden birini kullanın:
WindowsRuntimeStreamExtensions.AsStreamWindows Çalışma Zamanı 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ı bir çıkış akışını UWP uygulamaları için .NET'te yönetilen bir akışa dönüştürür.
WindowsRuntimeStreamExtensions.AsStreamForReadWindows Çalışma Zamanı 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 okumayı, yalnızca yazmayı veya okuma ve yazmayı destekleyen akış türleri sunar. Bu özellikler, bir Windows Çalışma Zamanı akışını .NET Framework akışına dönüştürdüğünüzde 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 ve yazılabilir olduğundan IRandomAccessStream (hem de IOutputStreamIInputStream) dönüştürme yöntemleri özgün akışın özelliklerini korur. Örneğin, 'yi dönüştürmek IRandomAccessStream için kullanmak WindowsRuntimeStreamExtensions.AsStreamForRead dönüştürülen .NET Framework akışını okunabilir olacak şekilde sınırlamaz. Ayrıca yazılabilir.
Örnek: Rastgele erişimi .NET Framework akışına Windows Çalışma Zamanı dönüştürme
Windows Çalışma Zamanı rastgele erişim akışından .NET Framework akışına dönüştürmek için yöntemini kullanınWindowsRuntimeStreamExtensions.AsStream.
Aşağıdaki kod örneği sizden bir dosya seçmenizi ister, dosyayı Windows Çalışma Zamanı API'lerle açar ve ardından bir .NET Framework akışına dönüştürür. Akışı okur ve bir metin bloğuna verir. Genellikle sonuçları çıkarmadan önce akışı .NET Framework API'leri ile işleyebilirsiniz.
// 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)
{
// ...
}
}
.NET Framework'ten Windows Çalışma Zamanı akışına dönüştürme
.NET Framework akışından Windows Çalışma Zamanı akışına dönüştürmek için aşağıdaki System.IO.WindowsRuntimeStreamExtensions yöntemlerden birini kullanın:
WindowsRuntimeStreamExtensions.AsInputStreamUWP uygulamaları için .NET'te yönetilen bir akışı Windows Çalışma Zamanı giriş akışına dönüştürür.
WindowsRuntimeStreamExtensions.AsOutputStreamUWP uygulamaları için .NET'te yönetilen bir akışı Windows Çalışma Zamanı bir çıkış akışına dönüştürür.
WindowsRuntimeStreamExtensions.AsRandomAccessStreamUWP uygulamaları için .NET'te yönetilen bir akışı, Windows Çalışma Zamanı okuma veya yazma için kullanabileceği rastgele erişim akışına dönüştürür.
.NET Framework akışını bir Windows Çalışma Zamanı akışına dönüştürdüğünüzde, dönüştürülen akışın özellikleri özgün akışa bağlıdır. Örneğin, özgün akış hem okumayı hem de yazmayı destekliyorsa ve akışı dönüştürmek için çağrısı WindowsRuntimeStreamExtensions.AsInputStream yaparsanız, döndürülen tür bir IRandomAccessStream
olur. IRandomAccessStream
ve IOutputStream
uygular IInputStream
ve okuma ve yazmayı destekler.
.NET Framework akışları, dönüştürmeden sonra bile kopyalamayı desteklemez. Bir .NET Framework akışını bir Windows Çalışma Zamanı akışına dönüştürür ve veya GetOutputStreamAtveya öğesini çağırırsanız GetInputStreamAtCloneStreamya da doğrudan çağırırsanız CloneStream bir özel durum oluşur.
Örnek: .NET Framework'ü rastgele erişim akışına Windows Çalışma Zamanı dönüştürme
Bir .NET Framework akışından Windows Çalışma Zamanı rastgele erişim akışına AsRandomAccessStream dönüştürmek için aşağıdaki örnekte gösterildiği gibi yöntemini kullanın:
Önemli
Kullandığınız .NET Framework akışının aramayı desteklediğinden emin olun veya bunu destekleyen bir akışa kopyalayın. Bunu belirlemek için özelliğini kullanabilirsiniz Stream.CanSeek .
// 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;