Bog'liq CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C
Глава.25 .Взаимодействие.с.компонентами.WinRT
// String и другие структуры.
// Конструкторы и методы запрещены.
public struct WinRTStruct {
public Int32 ANumber;
public String AString;
public WinRTEnum AEnum; // В действительности просто
} // 32-разрядное целое
// В сигнатуре делегатов должны содержаться WinRT-совместимые типы
// (без BeginInvoke/EndInvoke)
public delegate String WinRTDelegate(Int32 x);
// Интерфейсы могут содержать методы, свойства и события,
// но не могут быть обобщенными.
public interface IWinRTInterface {
// Nullable продвигается как IReference Int32? InterfaceProperty { get; set; }
}
// Члены без атрибута [Version(#)] по умолчанию используют версию
// класса (1) и являются частью одного нижележащего интерфейса COM,
// создаваемого программой WinMDExp.exe.
[Version(1)]
// Классы должны быть производными от Object, запечатанными,
// не обобщенными, должны реализовать только интерфейсы WinRT,
// а открытые члены должны быть типами WinRT
public sealed class WinRTClass : IWinRTInterface {
// Открытые поля запрещены
#region Класс может предоставлять статические методы, свойства и события
public static String StaticMethod(String s) { return "Returning " + s; }
public static WinRTStruct StaticProperty { get; set; }
// В JavaScript параметры 'out' возвращаются в виде объектов;
// каждый параметр становится свойством наряду с возвращаемым значением
public static String OutParameters(out WinRTStruct x, out Int32 year) {
x = new WinRTStruct { AEnum = WinRTEnum.NotNone, ANumber = 333,
AString = "Jeff" };
year = DateTimeOffset.Now.Year;
return "Grant";
}
#endregion
// Конструктор может получать аргументы, кроме out/ref
public WinRTClass(Int32? number) { InterfaceProperty = number; }
public Int32? InterfaceProperty { get; set; }
// Переопределяться может только метод ToString
public override String ToString() {
return String.Format("InterfaceProperty={0}",
InterfaceProperty.HasValue ? InterfaceProperty.Value.ToString() :
719 Определение.компонентов.WinRT.в.коде.C#
"(not set)");
}
public void ThrowingMethod() {
throw new InvalidOperationException("My exception message");
// Чтобы выдать исключение с конкретным кодом HRESULT,
// используйте COMException
//const Int32 COR_E_INVALIDOPERATION = unchecked((Int32)0x80131509);
//throw new COMException("Invalid Operation", COR_E_INVALIDOPERATION);
}
#region Массивы передаются, возвращаются ИЛИ заполняются; без комбинаций
public Int32 PassArray([ReadOnlyArray] /* Подразумевается [In] */
Int32[] data) {
return data.Sum();
}
public Int32 FillArray([WriteOnlyArray] /* Подразумевается [Out] */
Int32[] data) {
for (Int32 n = 0; n < data.Length; n++) data[n] = n;
return data.Length;
}
public Int32[] ReturnArray() {
return new Int32[] { 1, 2, 3 };
}
#endregion
// Коллекции передаются по ссылке
public void PassAndModifyCollection(IDictionary collection) {
collection["Key2"] = "Value2"; // Коллекция изменяется "на месте"
}
#region Перегрузка методов
// Перегруженные версии с одинаковым количеством параметров
// JavaScript считает идентичными
public void SomeMethod(Int32 x) { }
[Windows.Foundation.Metadata.DefaultOverload] // Метод назначается
public void SomeMethod(String s) { } // перегрузкой по умолчанию
#endregion
#region Автоматическая реализация события
public event WinRTDelegate AutoEvent;
public String RaiseAutoEvent(Int32 number) {
WinRTDelegate d = AutoEvent;
return (d == null) ? "No callbacks registered" : d(number);
}
#endregion
#region Ручная реализация события
продолжение