7

Только разбираюсь с .Net-Core интересуюсь.\

  1. Имеются ли изначально какие-либо зависимости в приложение на .Net-Core?
  2. Net-Core это же получается Native уже на выходе?

Если запустить на чистой системе без установленного NetFramework'a, приложение запустится ? ( нет возможности проверить )

GooliveR
  • 1,979
  • "Запустится" - и да и нет. Все зависит от того, как соберете. – EvgeniyZ Sep 11 '20 at 13:03
  • чтобы проверить такие вещи, имеет смысл поставить виртуалку – Макс Жуков Sep 11 '20 at 13:05
  • .NET Core и .NET Framework - это разные технологии. Поэтому приложение Core может работать без FW. Однако, в любом случае нужен установленный рантайм. – Alexander Petrov Sep 11 '20 at 13:23
  • @AlexanderPetrov можно же self-contained собрать – yolosora Sep 11 '20 at 13:26
  • @yolosora - да, я неверно выразился. Но рантайм так или иначе нужен, просто он будет включён в состав самого экзешника. – Alexander Petrov Sep 11 '20 at 13:56

1 Answers1

10

Visual Studio позволяет сделать Self-contained публикацию, которая будет включать в себя весь NET Core (ну или нужную его часть), при этом размер самого .exe файла увеличится до ~150 мегабайт, будет работать без уcтановленного .NET Core. В противном случае, требуется установка .NET Core Runtime.

введите сюда описание изображения

  • Framework-dependent - требуется установленный .NET Core
  • Self-contained - не требуется

Подробности можно почитать по этой ссылке.

Так же, .NET Framework и .NET Core Runtime - разные дистрибутивы. Приложения, собранные под Core не будут работать, если установлен только Framework, и наоборот. Устанавливать можно и то и другое одновременно, дистрибутивы не конфликтуют.

Net-Core это же получается Native уже на выходе? - Нет. Такая фича называется Native Ahead-Of-Time (Native AOT) компиляция, Microsoft обещают сделать подобную возможность в .NET 6. (изначально обещали в .NET 5, но обещание не выполнили, чем разгневали сообщество).

aepot
  • 49,560
  • Visual Studio позволяет сделать - это позволяет сделать сам .NET Core, а студия лишь оболочка, удобный интерфейс) Также, если отвечать на Если запустить на чистой системе без установленного NetFramework'a, приложение запустится?, то можно сказать, что "ДА", ибо оно запустится и даст окно, где попросит установить .NET Core, с кнопкой, которая перекинет на нужную страницу загрузки. Ну и тут видно, что человек не понимает, что Core и Framework это две разные вещи. Может стоит указать про это все? – EvgeniyZ Sep 11 '20 at 13:52
  • @EvgeniyZ последнее указал, остальное не считаю критичным. – aepot Sep 11 '20 at 14:01
  • Вот странно, в NET Framework получался вполне самодостаточный экзешник, и весил он всего 200 кБ, а тут при выборе Self-contained (если не выбрать опцию Produce Single File) в публикацию попадают вообще ненужные библиотеки, даже когда выбрана опция "Обрезать неиспользуемые сборки (в предварительной версии)". И да, получается под 150мБ. Существует ли какой-то действующий способ минифицировать? – Pavel Sumarokov Feb 13 '21 at 16:11
  • @EvgeniyZ вот именно, если NET Core не установлен, то приложение перекинет на страницу в инете, а не само установит. Это плохо с точки зрения дизайна приложения, особенно когда конечный пользователь - чайник, а таких большинство, какая-нибудь офисная блондинка – Pavel Sumarokov Feb 13 '21 at 16:13
  • @PavelSumarokov в NET Framework получался вполне самодостаточный экзешник, который не мог без установленного .NET Framework работать? Это не самодостаточный. Здесь у вас в 150 мегов влезает полностью вся нужная часть .NET Core, и устанавливать в принципе ничего не нужно. А так, если вам нужно именно порадовать юзера удобной установкой, попробуйте установщик ClickOnce, он там же в окне Publish доступен. Но там есть свои нюансы, например нельзя выбрать каталог установки. – aepot Feb 13 '21 at 16:16
  • @aepot странно, но работало на другом компьютере, или что, NET Framework идёт с некоторыми конфигурациями Windows? И сейчас в этих 150М куча ненужных библиотек, например Visual Basic, которым я не пользовался в приложении – Pavel Sumarokov Feb 13 '21 at 17:21
  • Странно, неужели вот это https://docs.microsoft.com/en-us/dotnet/core/deploying/ready-to-run не работает? – VladD Apr 18 '21 at 10:32
  • @VladD у автора имеется в виду компиляция в Native сборку (как C++). Быть может в ответе я не совсем точно выразился. Ready-to-run это по сути AOT, верно, но оно лишь оптимизирует скорость загрузки позволяя JIT использовать прекомпилированный код, а не компилировать IL в рантайме. А Native сборка, это когда JIT в принципе не нужен. – aepot Apr 18 '21 at 10:37
  • @aepot: Насколько я понимаю, R2R — это сразу нативный код, который может бежать и без JIT. У JIT есть tiered compilation, она может ещё больше соптимизировать (т. к. некоторые вещи известны лишь во время выполнения), и так и делает. – VladD Apr 18 '21 at 10:43
  • @VladD но это все равно не Native. Кстати, есть вот такой форк. Ну и вот репозиторий, где в данный момент мелкомягкие трудятся над Native AOT – aepot Apr 18 '21 at 10:52
  • @aepot: А в чём именно заключается ненативность R2R? Метаданные в любом случае нужно включать, т. к. они могут понадобиться для рефлексии. Исходный IL-код generic-методов тоже необходим, т. к. мы не может в compile time знать размер такого объекта: struct X<T> { T t; }. А всё остальное по идее в R2R есть, верно? – VladD Apr 18 '21 at 13:59
  • @VladD если R2R - это нативная сборка, то почему пишут что CoreCLR не совместим с Native AOT в принципе, поэтому фичу пилят исключительно под CoreRT? – aepot Apr 18 '21 at 14:02
  • @aepot: Не знаю, если честно, это надо бы спросить у тех, кто пишет. Но вот первый же абзац из документации: "R2R is a form of ahead-of-time (AOT) compilation." – VladD Apr 18 '21 at 14:05
  • @VladD мы говорим о разных вещах, вы про AOT, а я про Native AOT. В терминологии Microsoft это 2 разные независимые фичи. – aepot Apr 18 '21 at 14:12
  • @aepot: А в чём реальная разница? Я не в курсе, в гугле за 5 минут не нашлось. – VladD Apr 18 '21 at 14:29
  • @VladD не прямой ответ, но можно здесь почитать. – aepot Apr 18 '21 at 14:34
  • @aepot: Ну там по сути пишут, что они хотят ещё быстрее старт, и ещё меньше размер бинарника. То есть по сути ещё более хороший AOT. Но как по мне, это вовсе не означает, что AOT (то есть, компиляции в нативный код) нет, согласны? – VladD Apr 18 '21 at 14:37
  • @VladD Net-Core это же получается Native уже на выходе? - вопрос от автора был такой. И так как R2R не исключает присутствия JIT в рантайме, ответ был "нет". – aepot Apr 18 '21 at 14:43
  • @aepot: Учитывая наличие в языке generic'ов, полностью исключить JIT из рантайма не удастся никогда. Поэтому разумно предположить, что JIT будет и в Native AOT (ну или некоторые конструкции языка будут падать, например, generic с незнакомым типом параметров или dynamic). – VladD Apr 18 '21 at 14:47
  • @VladD значит ответа "да" не будет никогда. :) – aepot Apr 18 '21 at 14:48
  • 1
    @aepot: Мне кажется, вы даёте слишком строгие критерии «нативности». Но это уже авторские предпочтения, конечно. – VladD Apr 18 '21 at 14:49