Net framework 5, а также среды Visual Studio 2012 и C#



Download 6,27 Mb.
Pdf ko'rish
bet528/658
Sana12.06.2023
Hajmi6,27 Mb.
#950840
1   ...   524   525   526   527   528   529   530   531   ...   658
Bog'liq
CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C


Глава.25 .Взаимодействие.с.компонентами.WinRT
По сути, ссылка на 
Byte[]
упаковывается в объект, реализующий интерфейс 
IBuffer
; содержимое массива 
Byte[]
при этом не копируется, так что операция 
выполняется очень эффективно. Аналогичным образом, если у вас имеется объект 
MemoryStream
, в котором упакован буфер 
Byte[]
, вы просто вызываете для него 
метод 
GetWindowsRuntimeBuffer
, чтобы ссылка на буфер 
MemoryStream
была за-
ключена в объект, реализующий интерфейс 
IBuffer
. И снова содержимое буфера 
не копируется, поэтому операция обладает высокой эффективностью. Следующий 
метод демонстрирует обе ситуации:
private async Task ByteArrayAndStreamToIBuffer(IRandomAccessStream winRTStream,
Int32 count) { 
Byte[] bytes = new Byte[count]; 
await winRTStream.ReadAsync(bytes.AsBuffer(), (UInt32)bytes.Length, 
InputStreamOptions.None); 
Int32 sum = bytes.Sum(b => b); // Обращение к прочитанным байтам
// через Byte[] 
using (var ms = new MemoryStream()) 
using (var sw = new StreamWriter(ms)) { 
sw.Write("This string represents data in a stream"); 
sw.Flush(); 
UInt32 bytesWritten = await 
winRTStream.WriteAsync(ms.GetWindowsRuntimeBuffer()); 

}
Интерфейс WinRT 
IRandomAccessStream
реализует интерфейс WinRT 
IInput-
Stream
, определяемый следующим образом:
namespace Windows.Storage.Streams { 
public interface IOutputStream : IDisposable { 
IAsyncOperationWithProgress WriteAsync(IBuffer buffer); 

}
Когда вы вызываете методы расширения 
AsBuffer
или 
GetWindowsRuntimeBuffer
в своем коде, эти методы упаковывают исходный объект в объект, класс которого 
реализует интерфейс 
IBuffer
. Затем CLR создает для этого объекта обертку CCW 
и передает ее функции WinRT API. Когда функция WinRT API запрашивает свой-
ство 
Buffer
интерфейса 
IBufferByteAccess
для получения указателя на массив 
байтов, массив фиксируется в памяти, а его адрес возвращается WinRT API для 
обращения к данным. Фиксация снимается, когда WinRT API вызывает метод COM 
Release
для интерфейса 
IBufferByteAccess
.
Если вы вызываете функцию WinRT API, возвращающую 
IBuffer
, то, ско-
рее всего, сами данные находятся в неуправляемой памяти, и вам нужен меха-
низм обращения к этим данным из управляемого кода. Для решения этой за-
дачи следует обратиться к другим методам расирения, определяемым классом 
WindowsRuntimeBufferExtensions
.
namespace System.Runtime.InteropServices.WindowsRuntime { 
public static class WindowsRuntimeBufferExtensions { 


715
Определение.компонентов.WinRT.в.коде.C#
public static Stream AsStream(this IBuffer source); 
public static Byte[] ToArray(this IBuffer source); 
public static Byte[] ToArray(this IBuffer source, UInt32 sourceIndex, 
Int32 count); 
// Не показано: метод CopyTo для передачи байтов между IBuffer и Byte[] 
// Не показано: методы GetByte, IsSameData

}
Метод 
AsStream
создает объект, производный от 
Stream
, который служит оберт-
кой для исходного объекта 
IBuffer
. При наличии такого объекта можно обращаться 
к данным 
IBuffer
, вызывая 
Read

Write
и прочие подобные методы 
Stream
. Метод 
ToArray
во внутренней реализации создает 
Byte[]
, после чего копирует все байты 
из исходного объекта 
IBuffer
в 
Byte[]
; учтите, что этот метод расширения может 
дорого обходиться в отношении затрат памяти и процессорного времени.
Класс 
WindowsRuntimeBufferExtensions
также содержит несколько перегру-
женных версий метода 
CopyTo
, позволяющих копировать байты между 
IBuffer
и 
Byte[]
; метод 
GetByte
, читающий данные из 
IBuffer
по одному байту; и метод 
IsSameData
, сравнивающий содержимое двух объектов 
IBuffer
. Вряд ли эти методы 
будут часто использоваться в ваших приложениях.
Также стоит упомянуть о том, что .NET Framework определяет класс 
System.
Runtime.InteropServices.WindowsRuntimeBuffer
для создания объекта 
IBuffer

байты которого находятся в управляемой куче. Также существует компонент 
WinRT 
Windows.Storage.Streams.Buffer
для создания объекта 
IBuffer
, байты 
которого находятся в системной куче. Скорее всего, большинству разработчиков 
.NET Framework не придется использовать эти классы в своем коде.

Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   524   525   526   527   528   529   530   531   ...   658




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish