SlideShare a Scribd company logo
Microsoft
.NET Native
Ужасно краткий обзор
IL and JIT vs .NET Native
Как было раньше
IL JIT
MC
Что всегда было с нами?
метаданные библиотеки
CLR
код
сторонние
.NET
Framework
Как будет теперь
MC
Нюансы
сериализация рефлексия HttpClient
Новые исключения:
• MissingMetadataException
• MissingRuntimeArtifactException
• MissingInteropDataException
Рефлексия
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" />
HttpClient
• HttpClientHandler внутренне использует WinINet из-за этого:
 некоторые свойства возвращают false вместо true;
 появляются фиксированные значения вместо
настраиваемых;
• Не настраиваемое кол-во автоматических перенаправлений;
• Автоматическая распаковка;
• Cookie.
Файл конфигураций rd.xml
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<Namespace Name="Contoso.Cloud.AppServices" Serialize="Required Public" />
<Namespace Name="ContosoClient.ViewModels" Serialize="Required Public" />
<Namespace Name="ContosoClient.DataModel" Serialize="Required Public" />
<Namespace Name="Contoso.Reader.UtilityLib" Serialize="Required Public" />
<Namespace Name="System.Collections.ObjectModel" >
<TypeInstantiation Name="ObservableCollection"
Arguments="ContosoClient.DataModel.ProductItem" Serialize="Public" />
<TypeInstantiation Name="ReadOnlyObservableCollection"
Arguments="ContosoClient.DataModel.ProductGroup" Serialize="Public" />
</Namespace>
</Application>
</Directives>
Как его настраивать?
Типы политик: Типы параметров:
• Activate
• Browse
• Dynamic
• Serialize
• DataContractSerializer
• DataContractJsonSerializer
• XmlSerializer
• MarshalObject
• MarshalDelegate
• MarshalStructure
• All
• Auto
• Excluded
• Public
• PublicAndInternal
• Required Public
• Required PublicAndInternal
• Required All
Миграция
• вместо TypeLoadException - ошибкам времени компиляции
• избегайте долгих задержек и бесконечных циклов
• не вызывайте метод GC.WaitForPendingFinalizers из потока
пользовательского интерфейса
• при переопределении
методов ValueType.Equals и ValueType.GetHashCode - не
вызывайте реализации базового класса
• многомерные массивы, имеющие четыре или более измерений
не поддерживаются. Вместо этого используйте ступенчатые
массивы(массив массивов).
Отладка
• добавьте анализатор, для дополнительных
проверок
• пользуйтесь режимом Debug для основной
разработки
• НИКОГДА не забывайте периодически
запускать в Release!!!
.NET Native (Uneta 23.10.15)

More Related Content

Similar to .NET Native (Uneta 23.10.15)

C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
Igor Shkulipa
 
Droidcon Moscow 2015. Dagger2 практический ликбез по работе с кинжалами. Дмит...
Droidcon Moscow 2015. Dagger2 практический ликбез по работе с кинжалами. Дмит...Droidcon Moscow 2015. Dagger2 практический ликбез по работе с кинжалами. Дмит...
Droidcon Moscow 2015. Dagger2 практический ликбез по работе с кинжалами. Дмит...
Mail.ru Group
 
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
ngrebnev
 
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
corehard_by
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
Mikhail Shcherbakov
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
Sergey Teplyakov
 
Поговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийПоговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложений
Andrey Akinshin
 
Надежность ПО и Runtime Verification
Надежность ПО и Runtime VerificationНадежность ПО и Runtime Verification
Надежность ПО и Runtime Verification
ru_Parallels
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
Andrey Bibichev
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
m2rus
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptDmytro Mindra
 
Android осень 2013 лекция 4
Android осень 2013 лекция 4Android осень 2013 лекция 4
Android осень 2013 лекция 4Technopark
 

Similar to .NET Native (Uneta 23.10.15) (13)

C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
Droidcon Moscow 2015. Dagger2 практический ликбез по работе с кинжалами. Дмит...
Droidcon Moscow 2015. Dagger2 практический ликбез по работе с кинжалами. Дмит...Droidcon Moscow 2015. Dagger2 практический ликбез по работе с кинжалами. Дмит...
Droidcon Moscow 2015. Dagger2 практический ликбез по работе с кинжалами. Дмит...
 
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
 
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
 
Async
AsyncAsync
Async
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
Поговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийПоговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложений
 
Надежность ПО и Runtime Verification
Надежность ПО и Runtime VerificationНадежность ПО и Runtime Verification
Надежность ПО и Runtime Verification
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScript
 
Android осень 2013 лекция 4
Android осень 2013 лекция 4Android осень 2013 лекция 4
Android осень 2013 лекция 4
 

.NET Native (Uneta 23.10.15)

  • 2.
  • 3. IL and JIT vs .NET Native
  • 5. Что всегда было с нами? метаданные библиотеки CLR код сторонние .NET Framework
  • 7. Нюансы сериализация рефлексия HttpClient Новые исключения: • MissingMetadataException • MissingRuntimeArtifactException • MissingInteropDataException
  • 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.
  • 10. Файл конфигураций rd.xml <Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata"> <Application> <Namespace Name="Contoso.Cloud.AppServices" Serialize="Required Public" /> <Namespace Name="ContosoClient.ViewModels" Serialize="Required Public" /> <Namespace Name="ContosoClient.DataModel" Serialize="Required Public" /> <Namespace Name="Contoso.Reader.UtilityLib" Serialize="Required Public" /> <Namespace Name="System.Collections.ObjectModel" > <TypeInstantiation Name="ObservableCollection" Arguments="ContosoClient.DataModel.ProductItem" Serialize="Public" /> <TypeInstantiation Name="ReadOnlyObservableCollection" Arguments="ContosoClient.DataModel.ProductGroup" Serialize="Public" /> </Namespace> </Application> </Directives>
  • 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

  1. Первые упоминания – говорили об этом уже очень давно. Писались различные расширения, которые вроде бы как и давали решение, но все равно чего-то не хватало и было много недостатков. Технический пререлиз состоялся в 2014. Релиз состоялся 2015. Поддерживает только Windows Store приложения. Настраиваем в конфигурациях, гибкий и т.п.. Очень хорошо работает саппорт и все оперативно подсказывают и исправляют.
  2. Что это вообще такое? Зачем оно надо? Круто, что что-то новое, но чем было плохо старое? NET Native — это технология предварительной компиляции Инструменты .NET Native компилируются ваши IL-библиотеки с управляемым кодом в нативные библиотеки сразу, и отпадает JIT совсем, т.к. нечего компилировать во время работы. Прирост велик и скорость будет близка в плюсам До 60% повышения скорости холодного старта До 40% повышения скорости горячего старта Уменьшенное потребление памяти при компиляции в машинный код Нет зависимости от десктопного .NET Runtime при установке
  3. Как правило приложения, предназначенные для платформа.NET Framework компилируются в промежуточный язык (IL). Потом приходит загрузка проекта, погрузка сразу необходимых библиотек Перед выполнением какого-либо метода в первый раз JIT-компилятор компилирует IL-код в машинный код для локального компьютера.
  4. Метаданные, описывающие сборку, ее зависимости, типы, которые она содержит, и их члены. Метаданные используется для отражения и доступа через позднее связывание, а также в некоторых случаях для средств компиляции и построения. Код реализации. Он состоит из кодов операций промежуточного языка (IL). Во время выполнения JIT-компилятор преобразует его в машинный код для целевой платформы. Все дополнительные библиотеки классов и сборки сторонних производителей, необходимые приложению. Эти сборки точно так же включают метаданные, описывающие сборку, ее типы и члены, а также IL-код, который реализует все члены типов. Библиотека классов .NET Framework. Это коллекция сборок, устанавливаемая на локальном компьютере при установке платформы .NET Framework. Сборки, включенные в библиотеку классов .NET Framework, содержат полный набор метаданных и кода реализации. Среда CLR. Это коллекция библиотек DLL, которые выполняют такие операции, как загрузка сборок, управление памятью, сбор мусора, обработка исключений, JIT-компиляция, удаленное и локальное взаимодействие. Как и библиотека классов, среда выполнения устанавливается на локальном компьютере в процессе установки .NET Framework.
  5. Во время предварительной компиляции необходимые части платформы .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.
  6. Но не бывает такого, что все прям очень хорошо и при этом нет никаких нюансов или дополнений. Сериализация – проблема с определением типов в списках, просто определения типа в райнтаме из-за отсутствия нормальных метаданных проблемы при записи\чтении.
  7. Для успешной работы кода во время выполнения необходимы несколько элементов метаданных. Во-первых, метаданные Browse для универсального типа без экземпляров, AppClass<T>: Это позволяет вызову метода Type.GetType(String, Boolean) завершиться успешно и вернуть допустимый объект Type. Но даже при добавлении метаданных для универсального типа без экземпляров, вызов методаType.MakeGenericType приводит к исключению MissingMetadataException: Можно добавить следующую директиву времени выполнения в файл директив среды выполнения, чтобы добавить метаданные Activate для конкретного экземпляра, созданного над AppClass<T> из System.Int32:
  8. В .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 в ответах игнорируется как устаревший.
  9. Среда выполнения .NET Native не включает JIT-компилятор. В результате все необходимые машинные коды должны быть созданы заранее. Используется набор эвристических правил, чтобы определить, какой код должен создаваться, но они не могут охватывать все возможные сценарии метапрограммирования. Любая политика, заданная с помощью атрибута элемента применяется ко всем дочерним элементам, которые не определяют значение этой политики. Например, если политика определяется элементом Type, эта политика применяется для всех вложенных типов и членов, для которых политика не указана явно.
  10. Элементы 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 . Требует, чтобы цепочка инструментов поддерживала все типы и члены, независимо то того, используются они или нет, и включала для них политику.
  11. Исключения, например, 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] нет.