#c# #compilation #.net-core #.net-native #corert
#c# #Сборник #.net-core #.net- родной #corert
Вопрос:
Я создаю REST API на ASP.NET ЯДРО 1.0. В рабочей среде было бы, по-моему, очень полезно НЕ использовать JIT, потому что контейнеры docker с приложением масштабируются вверх и вниз, повторно развертываясь во время CI снова и снова, поэтому своевременная компиляция для каждого развернутого контейнера вызывает ужасные задержки, смертельные случаи при проверке работоспособности LB и другие проблемы.
Как я читал, собственная компиляция с dotnet CLI прекращена. Я пытался создавать с помощью CoreRT, но безуспешно (подробности по запросу из-за сложности).
Поскольку этот вопрос довольно абстрактный, я не предоставляю примеры кодов или подробную информацию, поэтому для начала есть несколько вопросов:
- Правильно ли мое предположение — решит ли компиляция с опережением времени проблему с медленным первым выполнением каждого пути — или — в любом случае нет другого решения?
- Если это правда, возможно ли в настоящее время создать «родное» приложение (цель ubuntu x64) из .NET Core?
- Если это так, какова наилучшая практика — как я могу это сделать? У кого-нибудь есть опыт в этом?
(Целевой платформой будет образ docker ubuntu-14.04-x64, а также платформа компиляции. Для целей разработки было бы неплохо скомпилировать его на OSX.)
Заранее благодарю вас.
Комментарии:
1. Если это выполнимо на данном этапе, я удивляюсь, почему Microsoft еще не объявляет об этом. Итак, я понимаю, что сейчас неподходящее время, и вам не следует беспокоиться о такой большой теме.
2. Вы уверены? Проект CoreRT звучит довольно многообещающе [ github.com/dotnet/corert/blob/master/Documentation /…
3. все знают, что это многообещающе, и Microsoft даже продемонстрировала его в прошлом году на Connect. Но прежде чем он достигнет производственного качества, оставьте его в покое.
4. Я опубликовал ответ, который, я думаю, поможет ниже, но … можете ли вы поделиться тем, как выглядит время запуска? Вы упоминаете сбои проверки работоспособности .. какие допуски вам нужно выполнить для этого?
Ответ №1:
В настоящее время полная предварительная компиляция невозможна. Это одна из целей проекта CoreRT, связанного выше, но он не находится ни в каком состоянии, которое я бы назвал готовым к производству. Прошлогоднюю демонстрацию Connect следует воспринимать с довольно большой долей скептицизма. Например, у них все еще нет подсистемы отражения. Однако у нас есть несколько решений, которые могут значительно сократить объем кода, который необходимо генерировать во время JIT. Для .NET Core инструмент называется CrossGen, и в наши дни он довольно популярен.
Пока я привлекаю ваше внимание, я также упомяну, что мы работаем над эволюцией формата NGEN / CrossGen, который устраняет значительную часть типичных проблем, связанных с типичными файлами ni. Это идет под именем ReadyToRun
Надеюсь, это поможет. Дайте мне знать, если у вас есть другие вопросы.
Раскрытие информации: я работаю над .NET Native runtime и команда компиляторов для UWP (дочерний проект CoreRT, LLILC и т. Д.)
Комментарии:
1. Спасибо за ваше внимание, я обязательно посмотрю на это. — Вернемся к вопросу выше — время запуска почти для каждого пути составляет 10-20 секунд. И это пока небольшой проект.
2. Поэтому я попытался использовать CrossGen. Нашел его где-то на десятом уровне папки кэша пакетов nuget. Но теперь я понимаю, что не знаю, как его использовать, поскольку для этого почти нет документации. Когда я запускаю его в проекте, он сообщает мне, что «Система. Частное. CoreLib.dll — пропал без вести. Не могли бы вы дать мне несколько основных инструкций? Я могу открыть новый вопрос.
3. Чтобы не вводить вас в заблуждение, я связался с разработчиками, которые владеют crossgen. Надеюсь, один из них поможет нам разобраться.
Ответ №2:
Существует руководство по использованию CrossGen на https://github.com/dotnet/coreclr/blob/master/Documentation/building/crossgen.md . Он немного устарел — я посмотрю, смогу ли я когда-нибудь его обновить. Наиболее важной частью использования CrossGen является указание переключателя -Platform_Assemblies_Paths в командной строке, чтобы указать CrossGen расположение всех необходимых зависимостей (например, System.Частное.CoreLib.dll ).
Надеюсь, это поможет. Пожалуйста, дайте мне знать, если у вас возникнут какие-либо дополнительные проблемы.