Какова цель Microsoft.Net.Compilers?


83

В чем важность этого компилятора? Это необходимо или можно обойтись без? В любом случае, зачем нужен другой компилятор, или это просто футуристический проект? Был бы признателен краткий обзор.


2
Это также зависимость от Microsoft.CodeDom.Providers.DotNetCompilerPlatformверсии 1.0.8 и ниже, так что вы можете видеть это по этой причине
KyleMit

1
Согласно Microsoft , Microsoft.Net.Compilersустарел в пользу Microsoft.Net.Compilers.Toolset.
Уве Кейм

Ответы:


96

Суть пакета Microsoft.Net.Compilers заключается в том, что для компиляции вашего проекта будут использоваться компиляторы, распространяемые с этим пакетом, а не компилятор, поставляемый с .NET Framework или Visual Studio. Наиболее практичным прямым преимуществом является то, что он позволяет вашим проектам использовать функции C # 6, а затем позволяет создавать эти проекты в системе, в которой не установлен компилятор C # 6, например, на сервере непрерывной интеграции, на котором вы не используете Я не хочу устанавливать полную версию Visual Studio 2015.


Мне нужно сделать очень простую вещь: скомпилировать любой файл .cs и выпустить il, не нужно проверять внешние ссылки и т. Д. Возможно ли это с Microsoft.Net.Compilers?
Бандары

@Bandara Невозможно скомпилировать C # без внешних ссылок, с Microsoft.Net.Compilers или без них. Ссылки на сборки необходимы, например, для разрешения перегрузки. А если у вас есть внешние ссылки, то это технически возможно с Microsoft.Net.Compilers, но на самом деле это неподходящий инструмент для работы. Вы запускаете внешний процесс, когда тот же компилятор уже доступен в других пакетах, и вы можете напрямую вызывать его в своей собственной программе.

См. Обновленный ответ от @JaredPar (MS), этот ответ больше не действителен. Думаю, нам следует проверить наши решения и удалить старые пакеты в пользу сборки с использованием современного набора инструментов VS / VSCode / SDK.
Тони Уолл

17

На данный момент нет цели для Microsoft.Net.Compilers. Это пакет NuGet, который устарел и перестанет выпускаться после Visual Studio 16.5. Существует пакет-преемник под названием Microsoft.Net.Compilers.Toolset. Этот пакет имеет те же функции, что и Microsoft.Net.Compilers, но работает с экземплярами .NET Desktop и .NET Core MSBuild.

Даже в этом случае Microsoft.Net.Compilers.Toolset не предназначен для общего пользования. Этот пакет предназначен для двух конкретных целей:

  1. Действует как краткосрочный инструмент для разблокировки клиентов, которые столкнулись с ошибками в компиляторе. Для таких клиентов мы можем использовать этот пакет, чтобы разблокировать их сценарии всего через час или около того после того, как мы добавим исправление в репозиторий Roslyn. Это служит мостом до тех пор, пока исправление не попадет в связанный выпуск обслуживания Visual Studio или .NET SDK. Когда это происходит, клиента просят удалить пакет из своего решения и полагаться на официально выпущенные наборы инструментов.
  2. Служит механизмом для перемещения двоичных файлов между Roslyn и официальными сборками .NET SDk.

Этот пакет не предназначен для длительного использования клиентами для своей сборки. Я понимаю, что некоторые клиенты предпочитают это делать, но такое использование также не поддерживается. Пакет может и будет регулярно вызывать сбои из-за зависимости от новых версий MSBuild или задач / целей в .NET SDK.

Клиентам, которые хотят использовать новые версии компилятора для своих сборок, вместо этого рекомендуется использовать один из официальных дистрибутивов компилятора:

  1. Используйте SKU средств сборки Visual Studio.
  2. Используйте .NET SDK

Примечание . Пакет Microsoft.Net.Compilers официально поддерживался как часть пакета Microsoft.CodeDom.Providers.DotNetCompilerPlatform несколько лет назад, поскольку это была зависимость. Начиная с версии 2.0, зависимость от Microsoft.Net.Compilers была удалена, и теперь он представляет собой полностью независимый пакет. В то же время мы перестали рекомендовать Microsoft.Net.Compilers, так как для него больше нет явных вариантов использования.

Это означает, что некоторые клиенты неожиданно обнаруживают, что Microsoft.Net.Compilers находится в их файле проекта, поскольку он не был удален, когда Microsoft.CodeDom.Providers.DotNetCompilerPlatform сбросила зависимость. Совет для таких клиентов - просто удалить ссылку на пакет. Это больше не нужно.


Очень интересная догадка. Мне интересно, почему аспект краткосрочного использования не упоминается в описании пакета NuGet: nuget.org/packages/Microsoft.Net.Compilers
Джек Миллер

@JackMiller Это упомянуто в Microsoft.Net.Compilers.Toolset . `Этот пакет в первую очередь предназначен для быстрой доставки исправлений клиентам. Использование его в качестве долгосрочного решения для предоставления новых компиляторов в старых установках MSBuild явно не поддерживается. Это может и будет ломаться на регулярной основе »,
Youssef13,

6

Это пакет, который предоставляет компиляторы C # и Visual Basic с открытым исходным кодом и API для анализа кода.

Вы можете найти обширную документацию на github:

https://github.com/dotnet/roslyn


5
Благодарю. Я уже знаком с официальной документацией, но все еще не могу понять цель проекта.
полезноBee

2
@usefulBee В основном это результат движения Microsoft за открытый исходный код, дополнительную информацию можно найти в википедии: en.wikipedia.org/wiki/.NET_Compiler_Platform
ViRuSTriNiTy

1

Как уже говорили другие, он содержит компиляторы .NET для C # и VB.NET.

Интересным аспектом того, что это пакет, является то, что вы можете указать конкретную сборку компилятора для своего проекта, включая версию, которая еще не была отправлена ​​с Visual Studio.

Мы используем это в https://github.com/dotnet/project-system, который является компонентом Visual Studio с открытым исходным кодом. Это позволяет нам использовать предварительные версии компилятора для тестирования функций языка, не поддерживаемых компилятором, который поставляется с VS.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.