Windows 10 - one application for all platforms. (UA Mobile 2016)Mykyta Bondarenko
This document discusses building a universal Windows application that shares code and has different interfaces for different device families. It covers the project structure, startup points, lifecycles, view models, data binding, converters, behaviors, templates, themes, .NET Native, and features like tiles and toasts. Resources provided include the UWP development guide, layout and design introduction, universal app samples on GitHub, and a blog post on .NET Native.
Выступление на "Найди ответ 6" 20 октября 2012.
Аннотация
Я расскажу о чем нужно знать HR'у и рекрутеру, когда он говорит с IT-профессионалами или теми, кто хочет ими стать. В этой среде много тонкостей и незнакомых "не-IT"-человеку терминов: C++, C#, JavaScript, frontend, backend, Ajax, .NET и так далее.
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Yulia Tsisyk
В докладе будут рассмотрены приемы оптимизации приложений на платформе .NET, в большей степени специфичные для desktop приложений. Тем не менее, представителям других направлений тоже будет что почерпнуть.
Для достижения максимальной скорости запуска приложения или поднятия из swap'а иногда приходится обращаться к нестандартным подходам, которые, на первый взгляд, могут идти наперекор общепринятой практике (например, отказ от emit в пользу reflection). Каждая из оптимизаций, начиная от устройства CLR, заканчивается анализом в xperf отдельных IO операций, будет подобно разобрана. В качестве результатов будут представлены показатели реальных продуктов.
Moscow .Net Meetup #4·14 ноября 2016
Парсим и кодогенерируем для С++ с использованием clangcorehard_by
Зачастую в промышленном программировании возникают рутинные задачи, которые могут быть единожды эффективно решены с помощью кодогенерации. В докладе представлена классификация таких проблем в контексте С++ и предложено решение, основанное на семействе инструментов clang. Приводятся примеры решения подобных задач из реальных проектов.
Уменьшение влияния человеческого фактора при разработке бизнес приложенийngrebnev
В этом докладе мы постараемся рассказать о принципах разработки инструментов для написания бизнес-логики, позволяющих сократить количество ошибок. Речь пойдет о нескольких практиках, принятых в отделе технологического развития нашей компании. Принципы будут проиллюстрированы на примере инструментария компании для платформы Microsoft .NET.
Максимум статических проверок. Под статическими проверками мы понимаем проверки времени компиляции. Этот принцип является важным, но, к сожалению, зачастую недооценивается разработчиками инструментария разработки. Проверки времени компиляции могут отлавливать большой спектр ошибок. Есть и другая особенность – это удобство. Ошибки времени исполнения сложнее воспринимаются, труднее найти причину ошибки.
Разнообразие и декларативность проверок. Проверки общего назначения удобно задавать в декларативном виде. При этом сами проверки должен осуществлять фреймворк. За счет уменьшения дублирования и декларативности снижается вероятность ошибок. Проверки должны быть, как техническими, так и уровня доменной модели. Мы будем говорить о проверках уровня доменной модели.
Возможность анализа декларативных проверок. Любые ограничения порождают некоторую модель. Эту модель (проверки) можно формально верифицировать. Вообще, проблема доказательства большинства свойств программы невозможна. Этот вопрос выходит далеко за рамки нашего доклада. Но существует возможность верификации более слабых (менее выразительных моделей).
Во второй части мы обсудим функционал, который мы называем "состояния". Эти "состояния" образуют что-то вроде автомата, или структуру Крипке. Так вот, существуют алгоритмы проверки выполнимости темпоральных логик на таких структурах.
Windows 10 - one application for all platforms. (UA Mobile 2016)Mykyta Bondarenko
This document discusses building a universal Windows application that shares code and has different interfaces for different device families. It covers the project structure, startup points, lifecycles, view models, data binding, converters, behaviors, templates, themes, .NET Native, and features like tiles and toasts. Resources provided include the UWP development guide, layout and design introduction, universal app samples on GitHub, and a blog post on .NET Native.
Выступление на "Найди ответ 6" 20 октября 2012.
Аннотация
Я расскажу о чем нужно знать HR'у и рекрутеру, когда он говорит с IT-профессионалами или теми, кто хочет ими стать. В этой среде много тонкостей и незнакомых "не-IT"-человеку терминов: C++, C#, JavaScript, frontend, backend, Ajax, .NET и так далее.
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Yulia Tsisyk
В докладе будут рассмотрены приемы оптимизации приложений на платформе .NET, в большей степени специфичные для desktop приложений. Тем не менее, представителям других направлений тоже будет что почерпнуть.
Для достижения максимальной скорости запуска приложения или поднятия из swap'а иногда приходится обращаться к нестандартным подходам, которые, на первый взгляд, могут идти наперекор общепринятой практике (например, отказ от emit в пользу reflection). Каждая из оптимизаций, начиная от устройства CLR, заканчивается анализом в xperf отдельных IO операций, будет подобно разобрана. В качестве результатов будут представлены показатели реальных продуктов.
Moscow .Net Meetup #4·14 ноября 2016
Парсим и кодогенерируем для С++ с использованием clangcorehard_by
Зачастую в промышленном программировании возникают рутинные задачи, которые могут быть единожды эффективно решены с помощью кодогенерации. В докладе представлена классификация таких проблем в контексте С++ и предложено решение, основанное на семействе инструментов clang. Приводятся примеры решения подобных задач из реальных проектов.
Уменьшение влияния человеческого фактора при разработке бизнес приложенийngrebnev
В этом докладе мы постараемся рассказать о принципах разработки инструментов для написания бизнес-логики, позволяющих сократить количество ошибок. Речь пойдет о нескольких практиках, принятых в отделе технологического развития нашей компании. Принципы будут проиллюстрированы на примере инструментария компании для платформы Microsoft .NET.
Максимум статических проверок. Под статическими проверками мы понимаем проверки времени компиляции. Этот принцип является важным, но, к сожалению, зачастую недооценивается разработчиками инструментария разработки. Проверки времени компиляции могут отлавливать большой спектр ошибок. Есть и другая особенность – это удобство. Ошибки времени исполнения сложнее воспринимаются, труднее найти причину ошибки.
Разнообразие и декларативность проверок. Проверки общего назначения удобно задавать в декларативном виде. При этом сами проверки должен осуществлять фреймворк. За счет уменьшения дублирования и декларативности снижается вероятность ошибок. Проверки должны быть, как техническими, так и уровня доменной модели. Мы будем говорить о проверках уровня доменной модели.
Возможность анализа декларативных проверок. Любые ограничения порождают некоторую модель. Эту модель (проверки) можно формально верифицировать. Вообще, проблема доказательства большинства свойств программы невозможна. Этот вопрос выходит далеко за рамки нашего доклада. Но существует возможность верификации более слабых (менее выразительных моделей).
Во второй части мы обсудим функционал, который мы называем "состояния". Эти "состояния" образуют что-то вроде автомата, или структуру Крипке. Так вот, существуют алгоритмы проверки выполнимости темпоральных логик на таких структурах.
Cтатический анализ кода (на примере DDD-фреймворка)ngrebnev
Они расскажут как при разработке бизнес-приложений в модели Domain-driven design они предупреждают ошибки программиста с помощью статического анализа кода и доменной модели. А именно: возможности ORM-платформы по статическому анализу, преимущества широкого использования Linq, декларативных ограничений, модель состояний и формальной верификации элементов доменной модели.
Они разберут, в чем заключается удобство разработчика по использованию статического анализа и простота применения механизмов для задания формальных ограничений на модель предметной области. Интеграция средств статического анализа ORM в среду разработки, невозможность игнорирования ошибок, гарантия прохождения всех статических проверок до первого запуска программы. Ограниченные возможности запросов Linq к модели предметной области по сравнению с Linq to Objects и пути их преодоления.
Они расскажут, как обстоят дела с аналогичными механизмами в других ORM-системах и почему они решили реализовать собственную платформу для поддержки разработки в рамках DDD.
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...corehard_by
За 40 минут мы вместе построим асинхронный мини-фреймворк потоковой обработки запросов. Без asio, без мьютексов, без future/promise и прочих новомодных штучек. "Без" не значит совсем без, - мы реализуем их по-другому, очень просто и, надеюсь, эффективно. Постараемся забыть о потоках, изобретем почти неблокируемый аллокатор, приправим все это планировщиком, - в результате получим апартаменты комфорт-класса.
Поговорим о микрооптимизациях .NET-приложенийAndrey Akinshin
Доклад для Middle и Senior .NET-программистов о микроптимизациях приложения, из которого Вы узнаете:
О том, как важно понимать IL и ASM код, соответствующий вашей C#-программе;
О различных уровнях микрооптимизаций начиная от C# и JIT компиляторов, заканчивая CPU;
Об особенностях оптимизаций под различные процессорные архитектуры;
Об отличиях разных версиях JIT-компиляторов, включая RyuJIT;
О том, как правильно замерять время выполнения приложений и оценивать эффективность оптимизаций.
Доклад будет полезен всем разработчикам, которые хотят хотят сделать свои и без того быстрые программы ещё на 5-10% быстрее.
Cтатический анализ кода (на примере DDD-фреймворка)ngrebnev
Они расскажут как при разработке бизнес-приложений в модели Domain-driven design они предупреждают ошибки программиста с помощью статического анализа кода и доменной модели. А именно: возможности ORM-платформы по статическому анализу, преимущества широкого использования Linq, декларативных ограничений, модель состояний и формальной верификации элементов доменной модели.
Они разберут, в чем заключается удобство разработчика по использованию статического анализа и простота применения механизмов для задания формальных ограничений на модель предметной области. Интеграция средств статического анализа ORM в среду разработки, невозможность игнорирования ошибок, гарантия прохождения всех статических проверок до первого запуска программы. Ограниченные возможности запросов Linq к модели предметной области по сравнению с Linq to Objects и пути их преодоления.
Они расскажут, как обстоят дела с аналогичными механизмами в других ORM-системах и почему они решили реализовать собственную платформу для поддержки разработки в рамках DDD.
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...corehard_by
За 40 минут мы вместе построим асинхронный мини-фреймворк потоковой обработки запросов. Без asio, без мьютексов, без future/promise и прочих новомодных штучек. "Без" не значит совсем без, - мы реализуем их по-другому, очень просто и, надеюсь, эффективно. Постараемся забыть о потоках, изобретем почти неблокируемый аллокатор, приправим все это планировщиком, - в результате получим апартаменты комфорт-класса.
Поговорим о микрооптимизациях .NET-приложенийAndrey Akinshin
Доклад для Middle и Senior .NET-программистов о микроптимизациях приложения, из которого Вы узнаете:
О том, как важно понимать IL и ASM код, соответствующий вашей C#-программе;
О различных уровнях микрооптимизаций начиная от C# и JIT компиляторов, заканчивая CPU;
Об особенностях оптимизаций под различные процессорные архитектуры;
Об отличиях разных версиях JIT-компиляторов, включая RyuJIT;
О том, как правильно замерять время выполнения приложений и оценивать эффективность оптимизаций.
Доклад будет полезен всем разработчикам, которые хотят хотят сделать свои и без того быстрые программы ещё на 5-10% быстрее.
8. Рефлексия
var type = Type.GetType("App1.AppClass`1", true);
Type[] typeArgs = {typeof(int)};
Type secondType = type.MakeGenericType(typeArgs);
Activator.CreateInstance(secondType);
Решение:
<Type Name="App1.AppClass`1" Browse="Required PublicAndInternal" />
Окончательное решение:
<TypeInstantiation Name="App1.AppClass"
Arguments="System.Int32"
Activate="Required Public" />
9. HttpClient
• HttpClientHandler внутренне использует WinINet из-за этого:
некоторые свойства возвращают false вместо true;
появляются фиксированные значения вместо
настраиваемых;
• Не настраиваемое кол-во автоматических перенаправлений;
• Автоматическая распаковка;
• Cookie.
11. Как его настраивать?
Типы политик: Типы параметров:
• Activate
• Browse
• Dynamic
• Serialize
• DataContractSerializer
• DataContractJsonSerializer
• XmlSerializer
• MarshalObject
• MarshalDelegate
• MarshalStructure
• All
• Auto
• Excluded
• Public
• PublicAndInternal
• Required Public
• Required PublicAndInternal
• Required All
12. Миграция
• вместо TypeLoadException - ошибкам времени компиляции
• избегайте долгих задержек и бесконечных циклов
• не вызывайте метод GC.WaitForPendingFinalizers из потока
пользовательского интерфейса
• при переопределении
методов ValueType.Equals и ValueType.GetHashCode - не
вызывайте реализации базового класса
• многомерные массивы, имеющие четыре или более измерений
не поддерживаются. Вместо этого используйте ступенчатые
массивы(массив массивов).
13. Отладка
• добавьте анализатор, для дополнительных
проверок
• пользуйтесь режимом Debug для основной
разработки
• НИКОГДА не забывайте периодически
запускать в Release!!!
Editor's Notes
Первые упоминания – говорили об этом уже очень давно. Писались различные расширения, которые вроде бы как и давали решение, но все равно чего-то не хватало и было много недостатков.
Технический пререлиз состоялся в 2014.
Релиз состоялся 2015.
Поддерживает только Windows Store приложения.
Настраиваем в конфигурациях, гибкий и т.п..
Очень хорошо работает саппорт и все оперативно подсказывают и исправляют.
Что это вообще такое? Зачем оно надо? Круто, что что-то новое, но чем было плохо старое?
NET Native — это технология предварительной компиляции
Инструменты .NET Native компилируются ваши IL-библиотеки с управляемым кодом в нативные библиотеки сразу, и отпадает JIT совсем, т.к. нечего компилировать во время работы.
Прирост велик и скорость будет близка в плюсам
До 60% повышения скорости холодного старта
До 40% повышения скорости горячего старта
Уменьшенное потребление памяти при компиляции в машинный код
Нет зависимости от десктопного .NET Runtime при установке
Как правило приложения, предназначенные для платформа.NET Framework компилируются в промежуточный язык (IL).
Потом приходит загрузка проекта, погрузка сразу необходимых библиотек
Перед выполнением какого-либо метода в первый раз JIT-компилятор компилирует IL-код в машинный код для локального компьютера.
Метаданные, описывающие сборку, ее зависимости, типы, которые она содержит, и их члены. Метаданные используется для отражения и доступа через позднее связывание, а также в некоторых случаях для средств компиляции и построения.
Код реализации. Он состоит из кодов операций промежуточного языка (IL). Во время выполнения JIT-компилятор преобразует его в машинный код для целевой платформы.
Все дополнительные библиотеки классов и сборки сторонних производителей, необходимые приложению. Эти сборки точно так же включают метаданные, описывающие сборку, ее типы и члены, а также IL-код, который реализует все члены типов.
Библиотека классов .NET Framework. Это коллекция сборок, устанавливаемая на локальном компьютере при установке платформы .NET Framework. Сборки, включенные в библиотеку классов .NET Framework, содержат полный набор метаданных и кода реализации.
Среда CLR. Это коллекция библиотек DLL, которые выполняют такие операции, как загрузка сборок, управление памятью, сбор мусора, обработка исключений, JIT-компиляция, удаленное и локальное взаимодействие. Как и библиотека классов, среда выполнения устанавливается на локальном компьютере в процессе установки .NET Framework.
Во время предварительной компиляции необходимые части платформы .NET Framework статически связываются с приложением. Это позволяет приложению работать с библиотеками локальных приложений платформы.NET Framework, а компилятору — выполнять глобальный анализ для улучшения производительности. В результате приложения постоянно запускаются быстрее даже после обновлений платформы .NET Framework.
Среда выполнения .NET Native оптимизирована для статической предварительной компиляции и, таким образом, способна обеспечить высокую производительность.
.NET Native использует то же сервер, что и компилятор C++, который оптимизирован для статических сценариев предварительной компиляции.
Везде, где возможно, делается попытка исключить все метаданные.
5. .NET Native включает в заключительные сборки приложения только тот код реализации, который фактически вызывается приложением. Особенно это касается кода сторонних библиотек и кода в библиотеке классов .NET Framework. В результате приложение больше не зависит от сторонних библиотек или всей библиотеки классов .NET Framework; вместо этого код сторонних библиотек и библиотек классов .NET Framework теперь является локальным для приложения.
6. .NET Native заменяет полную среду CLR на оптимизированную среды выполнения, которая в первую очередь содержит сборщика мусора. Оптимизированная среда выполнения находится в библиотеке mrt100_app.dll, которая является локальной для приложения и имеет размер только несколько сотен килобайт. Это возможно потому, что статическое связывание устраняет необходимость во многих операциях, реализуемых средой CLR.
Но не бывает такого, что все прям очень хорошо и при этом нет никаких нюансов или дополнений.
Сериализация – проблема с определением типов в списках, просто определения типа в райнтаме из-за отсутствия нормальных метаданных проблемы при записи\чтении.
Для успешной работы кода во время выполнения необходимы несколько элементов метаданных. Во-первых, метаданные Browse для универсального типа без экземпляров, AppClass<T>:
Это позволяет вызову метода Type.GetType(String, Boolean) завершиться успешно и вернуть допустимый объект Type.
Но даже при добавлении метаданных для универсального типа без экземпляров, вызов методаType.MakeGenericType приводит к исключению MissingMetadataException:
Можно добавить следующую директиву времени выполнения в файл директив среды выполнения, чтобы добавить метаданные Activate для конкретного экземпляра, созданного над AppClass<T> из System.Int32:
В .NET Native класс HttpClientHandler внутренне использует WinINet (через класс HttpBaseProtocolFilter) вместо классов WebRequest и WebResponse, использованном в стандартных приложениях .NET для Магазина Windows.WinINet не поддерживает все параметры конфигурации, которые поддерживает класс HttpClientHandler. Это приводит к следующим результатам:
Некоторые свойства возможности на HttpClientHandler возвращают false на .NET Native, в то время как они возвращают true в стандартных приложениях .NET для магазина Windows.
Некоторые методы доступа к свойству конфигурации get всегда возвращают фиксированное значение на .NET Native, которое отличается от настраиваемого значения по умолчанию в приложениях .NET для магазина Windows.
В следующих подразделах описаны некоторые дополнительные различия в поведении.
Автоматическое перенаправление
Класс HttpBaseProtocolFilter не допускает настройки максимального количества автоматических перенаправлений. Значение свойства HttpClientHandler.MaxAutomaticRedirections равно 50 по умолчанию в стандартных приложениях .NET для магазина Windows и может быть изменено. На .NET Native, значение этого свойства равно 10 и попытка его изменить вызывает исключение PlatformNotSupportedException.
СвойствоHttpClientHandler.SupportsRedirectConfiguration возвращает false на .NET Native, в то время как оно возвращаетtrue в приложениях .NET для магазина Windows.
Автоматическая распаковка
Приложения .NET для магазина Windows позволяют задать свойство HttpClientHandler.AutomaticDecompressionна Deflate, GZip, оба Deflate и GZip или None. .NET Native поддерживает Deflate только вместе с GZip или None.При попытке задать свойство AutomaticDecompression только на Deflate или GZip происходит его автоматическое задание на оба Deflate и GZip.
Файлы cookie
Обработка файлов cookie выполняется одновременно с HttpClient и WinINet. Файлы cookie из CookieContainerобъединяются вместе файла cookie в кэше WinINet cookie. Удаление файла cookie из CookieContainerзапрещает HttpClient отправлять файл cookie, но если файл cookie уже был просмотрен WinINet и файлы "cookie" не были удалены пользователем, WinINet отправляет его. Не существует средств программного удаления файла cookie из WinINet с использованием API HttpClient, HttpClientHandler или CookieContainer.
Задание свойства HttpClientHandler.UseCookies на false вызывает только HttpClient, чтобы остановить отправку файлов "cookie"; WinINet может по-прежнему включить свои файлы cookie в запрос.
Значение свойства HttpClientHandler.ClientCertificateOptions всегда Automatic. В приложения .NET для магазина Windows, по умолчанию используется Manual.
Свойство HttpClientHandler.MaxRequestContentBufferSize не настраивается.
Свойство HttpClientHandler.PreAuthenticate всегда имеет значение true. В приложения .NET для магазина Windows, по умолчанию используется false.
Заголовок SetCookie2 в ответах игнорируется как устаревший.
Среда выполнения .NET Native не включает JIT-компилятор. В результате все необходимые машинные коды должны быть созданы заранее. Используется набор эвристических правил, чтобы определить, какой код должен создаваться, но они не могут охватывать все возможные сценарии метапрограммирования.
Любая политика, заданная с помощью атрибута элемента применяется ко всем дочерним элементам, которые не определяют значение этой политики. Например, если политика определяется элементом Type, эта политика применяется для всех вложенных типов и членов, для которых политика не указана явно.
Элементы Application, Assembly, AttributeImplies, Namespace, Subtypes и Type поддерживают следующие тип политик:
Activate . Управляет доступом среды выполнения к конструкторам для включения активации экземпляров.
Browse . Управляет запросами для получения сведений об элементах программы, но не включает доступ среды выполнения.
Dynamic . Управляет доступом среды выполнения ко всем членам типа, включая конструкторы, методы, поля, свойства и события, чтобы включить динамическое программирование.
Serialize . Управляет доступом среды выполнения к конструкторам, полям и свойствам, позволяющим сериализовать и десериализовать экземпляры типа с помощью таких библиотек сторонних поставщиков, как сериализатор Newtonsoft JSON.
DataContractSerializer . Определяет политику для сериализации, в которой используется классSystem.Runtime.Serialization.DataContractSerializer.
DataContractJsonSerializer . Определяет политику для сериализации JSON, в которой используется класс System.Runtime.Serialization.DataContractSerializer.
XmlSerializer . Определяет политику для сериализации XML, в которой используется классSystem.Xml.Serialization.XmlSerializer.
MarshalObject . Определяет политику для маршалинга ссылочных типов в WinRT и COM.
MarshalDelegate . Определяет политики для маршалинга типов делегатов как указателей функции на машинный код.
MarshalStructure . Определяет политику для маршалинга структуры в машинный код.
Параметры, связанные с этими типами политики:
All . Включить политику для всех типов и членов, которые не удаляет цепочка инструментов.
Auto . Использовать поведение по умолчанию. (Отсутствие назначения политики эквивалентно установке политики Auto, если только эта политика не переопределяется, например, родительским элементом.)
Excluded . Выключить политику для программного элемента.
Public . Включить политику для открытых типов и членов, если только цепочка средство не определяет, что элемент является необязательным и поэтому удаляет его. (В последнем случае необходимо использовать Required Public чтобы обеспечить сохранение элемента с возможностями отражения.)
PublicAndInternal . Включить политику для открытых и внутренних типов и членов, если цепочка инструментов не удаляет их.
Required Public . Требует, чтобы цепочка инструментов поддерживала открытые типы и члены, независимо то того, используются они или нет, и включала для них политику.
Required PublicAndInternal . Требует, чтобы цепочка инструментов поддерживала открытые и закрытые типы и члены, независимо то того, используются они или нет, и включала для них политику.
Required All . Требует, чтобы цепочка инструментов поддерживала все типы и члены, независимо то того, используются они или нет, и включала для них политику.
Исключения, например, TypeLoadException, которые вызываются с помощью JIT-компилятора при запуске приложения в общеязыковой среде выполнения (CLR), обычно приводят к ошибкам времени компиляции, когда обрабатываются средством .NET Native.
не вызывайте метод GC.WaitForPendingFinalizers из потока пользовательского интерфейса приложения. Это может привести к взаимоблокировке в .NET Native.
Не полагайтесь на порядок вызова конструктора статического класса. В .NET Native, порядок вызова отличается от порядка в стандартной среде выполнения. (Даже со стандартной средой выполнения, не следует рассчитывать на порядок выполнения конструкторов статических классов.)
Бесконечный цикл без вызовов (например, while(true);) на любом потоке может привести к остановке приложения. Аналогичным образом, большие или бесконечные ожидания могут также привести приложение к остановке.
Кэш WinInet не включен по умолчанию на платформе .NET для приложений магазина Windows, но он включен на .NET Native. Это повышает производительность, но сказывается на рабочем наборе. Не требуется никаких действий разработчика.
При переопределении методов ValueType.Equals и ValueType.GetHashCode для типа значения не вызывайте реализации базового класса. В приложениях .NET для магазина Windows эти методы основаны на отражении. Во время компиляции .NET Native генерирует реализацию, которая не зависит от отражения среды выполнения. Это означает, что если не переопределить эти два метода, они будут работать, как ожидалось, поскольку .NET Native создает реализацию во время компиляции. Однако, переопределение этих методов с помощью вызова реализации базового класса приводит к возникновению исключения.
Многомерные массивы, имеющие четыре или более измерений не поддерживаются; т.е. их значение свойства Array.Rank равно или больше четырех. Вместо этого используйте ступенчатые массивы(массива массивов). Например array[x,y,z] является недопустимым, но array[x][y][z] нет.