Bog'liq CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C
Глава.25 .Взаимодействие.с.компонентами.WinRT
// Закрытое поле для отслеживания зарегистрированных делегатов события
private EventRegistrationTokenTable m_manualEvent = null;
// Ручная реализация методов add и remove
public event WinRTDelegate ManualEvent {
add {
// Получение существующей таблицы (или создание новой,
// если таблица еще не инициализирована)
return EventRegistrationTokenTable .GetOrCreateEventRegistrationTokenTable(ref m_manualEvent)
.AddEventHandler(value);
}
remove {
EventRegistrationTokenTable .GetOrCreateEventRegistrationTokenTable(ref m_manualEvent)
.RemoveEventHandler(value);
}
}
public String RaiseManualEvent(Int32 number) {
WinRTDelegate d = EventRegistrationTokenTable .GetOrCreateEventRegistrationTokenTable(ref
m_manualEvent).InvocationList;
return (d == null) ? "No callbacks registered" : d(number);
}
#endregion
#region Asynchronous methods
// Асинхронные методы ДОЛЖНЫ возвращать
// IAsync[Action|Operation](WithProgress)
// ПРИМЕЧАНИЕ: другие языки видят DataTimeOffset как
// Windows.Foundation.DateTime
public IAsyncOperationWithProgress DoSomethingAsync() {
// Используйте методы Run класса
// System.Runtime.InteropServices.WindowsRuntime.AsyncInfo
// для вызова закрытого метода, написанного исключительно
// на управляемом коде.
return AsyncInfo.Run(DoSomethingAsyncInternal);
}
// Реализация асинхронной операции на базе закрытого метода
// с использованием обычных технологий .NET
private async Task DoSomethingAsyncInternal(
CancellationToken ct, IProgress progress) {
for (Int32 x = 0; x < 10; x++) {
// Поддержка отмены и оповещений о ходе выполнения
ct.ThrowIfCancellationRequested();
if (progress != null) progress.Report(x * 10);
await Task.Delay(1000); // Имитация асинхронных операций
}
721 Определение.компонентов.WinRT.в.коде.C#
return DateTimeOffset.Now; // Итоговое возвращаемое значение
}
public IAsyncOperation DoSomethingAsync2() {
// Если отмена и оповещения не нужны, используйте
// методы расширения AsAsync[Action|Operation]
// класса System.WindowsRuntimeSystemExtensions
// (они вызывают AsyncInfo.Run в своей внутренней реализации)
return DoSomethingAsyncInternal(default(CancellationToken),
null).AsAsyncOperation();
}
#endregion
// После распространения версии новые члены следует помечать
// атрибутом [Version(#)], чтобы программа WinMDExp.exe
// помещала новые члены в другой интерфейс COM. Это необходимо,
// поскольку интерфейсы COM должны быть неизменными.
[Version(2)]
public void NewMethodAddedInV2() {}
}
}
Следующий код JavaScript демонстрирует обращения ко всем представленным
компонентам и функциям WinRT.
function () {
// Для удобства обращения к пространству имен в коде
var WinRTComps = Wintellect.WinRTComponents;
// Обращение к статическому методу и свойству типа WinRT
var s = WinRTComps.WinRTClass.staticMethod(null); // JavaScript передает "null"!
var struct = { anumber: 123, astring: "Jeff", aenum:
WinRTComps.WinRTEnum.notNone };
WinRTComps.WinRTClass.staticProperty = struct;
s = WinRTComps.WinRTClass.staticProperty; // Обратное чтение
// Если метод имеет выходные параметры, они и возвращаемое значение
// передаются в виде свойств объекта
var s = WinRTComps.WinRTClass.outParameters();
var name = s.value; // Возвращаемое значение
var struct = s.x; // Параметр 'out'
var year = s.year; // Другой параметр 'out'
// Создание экземпляра компонента WinRT
var winRTClass = new WinRTComps.WinRTClass(null);
s = winRTClass.toString(); // Вызов ToString()
// Выдача и перехват исключений
try { winRTClass.throwingMethod(); }
catch (err) { }
// Передача массива
var a = [1, 2, 3, 4, 5]
;
продолжение