Не удалось найти тип поставщика CodeDom «Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider».


159

Это проект WebApi, использующий VS2015.

Шаг для воспроизведения:

  1. Создать пустой проект WebApi
  2. Измените путь вывода Build с «bin \» на «bin \ Debug \»
  3. Бегать

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

Все работает отлично, пока я не изменил путь вывода сборки с "bin \" на "bin \ Debug \". На самом деле, любой путь вывода, кроме "bin \", работать не будет.

Еще одна небольшая дополнительная вещь заключается в том, что наличие другого выходного пути в любое место будет работать, пока я оставляю сборку в «bin \».

Пожалуйста, помогите решить проблему. Я предполагаю, что это будет стоить проблемы при фактическом развертывании.


Могу я спросить, почему вы изменили путь вывода вашего веб-приложения? Спасибо.
— X-Mao

Это исключение происходит со мной каждый раз, когда я обновляю ранее запущенное приложение ASP.NET MVC во время компиляции msbuild .
— Николай Костов

То же самое случилось со мной. Это началось после того, как я добавил ссылки на пару библиотек .dll. Я исправил это, удалив и переустановив библиотеки. И понятия не имею, почему это вообще произошло ..
— Летие Техера

Ответы:


127

Если в вашем проекте есть ссылки на Roslyn, и вы развертываете его на сервере IIS , вы можете получить нежелательные ошибки на веб-сайте, поскольку многие провайдеры хостинга все еще не обновили свои серверы и, следовательно, не поддерживают Roslyn.

Чтобы решить эту проблему, вам нужно удалить компилятор Roslyn из шаблона проекта . Удаление Roslyn не должно влиять на функциональность вашего кода. Он работал нормально для меня и некоторых других проектов (C # 4.5.2), над которыми я работал.

Сделайте следующие шаги:

  1. Удалите из следующих пакетов Nuget с помощью командной строки, показанной ниже ( или вы можете использовать графический интерфейс диспетчера пакетов Nuget, щелкнув правой кнопкой мыши на Root Project Solution и удалив их ).

    PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
    PM> Uninstall-package Microsoft.Net.Compilers
  2. Удалите следующий код из файла Web.Config и перезапустите IIS . ( Используйте этот метод, только если шаг 1 не решит вашу проблему. )

    <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>


4
Я застрял на "ошибка сервера в" / "приложении" в течение дня. Я компилирую простое приложение Hello World в Visual Studio 2015, развертываю его на веб-сервере и получаю эту ошибку. Удаление вышеприведенных строк <compiler> также решило эту проблему. Я хотел бы знать, как на земле это происходит и есть ли лучшее решение. Я нахожу совершенно невероятным, что вы не можете развернуть приложение hello world таким образом, не сталкиваясь с проблемами, это как MS не выполняет никакого тестирования: -)
— user2728841

4
Чтобы включить Roslyn, вы можете увидеть следующую статью Включение платформы компилятора .NET («Roslyn») в приложениях ASP.NET. Почему компиляция Roslyn в ASP.NET? Включение новых компиляторов Roslyn в ваше приложение ASP.NET приведет к двум основным преимуществам: * Поддержка новых языковых функций * Потенциально улучшенное время запуска / предварительной компиляции приложения
— vibs2006,

1
Когда я создал новый веб-проект, он пришел с уже существующими ссылками. Почему они установлены по умолчанию, какова их цель? Также, насколько я понимаю, Roslyn - новый компилятор C #. Как удаление не нарушает Visual Studio?
— Дженс Мандер,

@JensMander - обе среды выполнения компиляции. В IIS нам нужно вручную включить Roslyn Compiler. Пожалуйста, смотрите ссылку в моем предыдущем комментарии к статье'Enabling the .NET Compiler Platform.
— Vibs2006

У меня была та же ошибка, наконец-то обновленный последний пакет для Microsoft.CodeDom.Providers.DotNetCompilerPlatform решен для меня.
— Красный,

47

Будьте осторожны, следуя совету этого ответа. Хотя это решает проблему под рукой, это может вызвать другие проблемы на более позднем этапе.

У меня та же проблема. Видимо компилятор .NET не был загружен в GAC. Что я сделал, чтобы решить это было:

Сначала в консоли диспетчера пакетов введите:

PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

Теперь по какой-то причине милые джентльмены из Microsoft решили не устанавливать его в GAC для нас. Вы можете сделать это вручную, открыв Командную строку разработчика и введя:

gacutil -i "C:\*PATH TO YOUR APP CODE*\bin\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll"

Вывод

Microsoft старается побудить всех делать все с помощью Nuget, что может быть хорошо без случайных ошибок, с которыми вы сталкиваетесь в системе Nuget. Попробуйте использовать один и тот же проект в разных решениях, случайно (или нет) обновить один из множества нюгетов, которые он использует для одного из них, и, если вам не повезет, вы поймете, что я имею в виду, когда попытаетесь построить другое решение. С другой стороны, размещение файлов в GAC также может вызвать проблемы в будущем, поскольку люди, как правило, забывают, что они там помещают, а затем при настройке новых сред они забывают включить эти файлы. Другое возможное решение - поместить файлы в центральную папку для сторонних библиотек DLL (даже если странно называть компилятор сторонним), что создает проблемы с неработающими ссылками при настройке новых сред. Если вы решите установить DLL в GAC, будьте осторожны и помните, что вы так и сделали. Если вы этого не сделаете, загрузите nuget для каждого проекта еще раз и несите все досадные ошибки, вызванные им (по крайней мере, раньше случалось, когда мне это надоело, и я просто помещал файлы в GAC). Оба подхода могут вызвать у вас головную боль и создать проблемы, это просто вопрос о том, какие проблемы вы предпочитаете решать. Microsoft рекомендует использовать систему nuget, и, как правило, лучше слушать их, чем неизвестного программиста в SO, если вы не устали от системы nuget и не привыкли иметь дело с GAC достаточно долго, чтобы она стала лучшей альтернативой для тебя. загрузите nuget для каждого проекта еще раз и несите все раздражающие ошибки, вызванные им (по крайней мере, раньше случалось, когда мне это надоело, и я просто помещал файлы в GAC). Оба подхода могут вызвать у вас головную боль и создать проблемы, это просто вопрос о том, какие проблемы вы предпочитаете решать. Microsoft рекомендует использовать систему nuget, и, как правило, лучше слушать их, чем неизвестного программиста в SO, если вы не устали от системы nuget и не привыкли иметь дело с GAC достаточно долго, чтобы она стала лучшей альтернативой для тебя. загрузите nuget для каждого проекта еще раз и несите все раздражающие ошибки, вызванные им (по крайней мере, раньше случалось, когда мне это надоело, и я просто помещал файлы в GAC). Оба подхода могут вызвать у вас головную боль и создать проблемы, это просто вопрос о том, какие проблемы вы предпочитаете решать. Microsoft рекомендует использовать систему nuget, и, как правило, лучше слушать их, чем неизвестного программиста в SO, если вы не устали от системы nuget и не привыкли иметь дело с GAC достаточно долго, чтобы она стала лучшей альтернативой для тебя.


41
Это не должно быть в GAC. Весь смысл подхода Nuget заключается в том, чтобы ваш проект использовал конкретную версию C # или VB.NET без каких-либо изменений в хост-системе. См. Этот пост от Дамиана Эдвардса из MSFT: blogs.msdn.microsoft.com/webdev/2014/05/12/…
— Судханшу Мишра,

30
Эти сборки НЕ принадлежат GAC, точка. Размещение их в GAC приведет к возможной головной боли, когда кто-то, кому нужно поддерживать ваш код, не сможет определить, почему используется неправильный компилятор.
— EKW

5
-1 за замечания Microsoft. Как будто это круто делать в эти дни. Кстати, у нюгетов есть много преимуществ, которые делают их очень популярными, которые вы просто игнорируете. А теперь представьте, что думают об этом господа Microsoft.
— Фабио Мильейру,

2
@YuvalPerelman Microsoft делает много разрушительных вещей за последние 3-4 года (например, дестабилизирует Visual Studio, производя продукты очень низкого качества). Иногда я даже молюсь, чтобы все руководство отдела разработки было уволено. Однако это определенно не тот случай!
— Марис

2
GAC - это самая удивительная вещь, которую я видел за последнее время.
— Свен

31

Просто добавьте следующий пакет nuget в свой проект Microsoft.CodeDom.Providers.DotNetCompilerPlatform.

Была такая же проблема.


Просто будь немного осторожнее; он перезаписывает 'compilerOptions' в файле web.config, поэтому перед установкой обязательно сохраните все пользовательские значения.
— Раддерз

19

У меня та же проблема, что мое приложение работало в Vs2013, но получало ошибку после обновления до Vs2015.

  1. В Vs2015 щелкните правой кнопкой мыши папку References проекта, чтобы открыть диспетчер пакетов NuGet.
  2. На вкладке «Обзор» найдите «DotNetCompilerPlatform» и установите lib «Microsoft.CodeDom.Providers.DotNetCompilerPlatform».

2
Спасибо за подсказку, щелкнув правой кнопкой мыши папку «
— Проекты»

3
Попробуйте сначала удалить его, а затем снова установить в NuGet. Это сработало для меня.
— Мэтт

Вы легенда
— Mo D Genesis

16

Я знаю, что это старая ветка, но я бы хотел указать на возможную проблему версии DotNetCompilerPlatform.dll, f. ех. после обновления. Пожалуйста, проверьте, отличается ли новый сгенерированный файл Web.config от вашего выпущенного файла web.config, в частности части system.codedom. В моем случае это было изменение версии с 1.0.7 до 1.0.8. Новая dll уже была скопирована на сервер, но я не изменил старый web.config (с некоторыми специальными настройками сервера):

<pre>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
</pre>

После обновления двух строк ошибка исчезла.


1
У меня есть проблемы с DotNetCompilerPlatform каждый одиночный время его обновить.
— LarryBud

2
Если вы удалите атрибут версии, он также будет работать и предотвратит повторное возникновение ошибки при следующем обновлении.
— MiguelSlv

Такая же проблема , я только что , кроме я должен был обновить от 2.0.0до2.0.1
— Рори McCrossan

12

В соответствии с вашими действиями по воспроизведению, я предположил, что изменение пути вывода в свойстве приложения было вашим единственным изменением после создания приложения. Единственное, что делает это изменение, - это говорит Visual Studio поместить выходные сборки MSBuild в новую папку. Однако во время выполнения ASP.Net не догадывается, что он должен загружать сборки из этой новой папки, а не из папки \ bin.

Этот ответ показывает, как изменить выходной каталог сборки приложения WebApi. Чтобы получить ту же ошибку, что и в этом посте, вам нужно закомментировать весь раздел <system.codedom> в web.config. И тогда вы можете следовать инструкциям, чтобы изменить выходной путь.

После того, как вы получите работу приложения, вы можете раскомментировать раздел <system.codedom>. Если вы вообще не используете новый синтаксис C # 6 в своем приложении, вы можете удалить Microsoft.CodeDom.Providers.DotNetCompilerPlatform из вашего приложения; в противном случае вы можете добавить следующую командную строку в событие после сборки,

xcopy /Q /Y "$(TargetDir)roslyn\*.*" "$(TargetDir)..\roslyn\"

Новый провайдер CodeDom всегда ищет папку «\ roslyn» в \ bin. Приведенная выше команда работает в качестве обходного пути и копирует папку \ roslyn из новой папки вывода в \ bin.

В моих экспериментах инструмент публикации Visual Studio, однако, публиковал выходные сборки в папке \ bin в месте развертывания независимо от настроек пути вывода. Я предполагаю, что ваше приложение все еще должно работать в реальном развертывании.


10

Простой способ - Project> Управление пакетами NuGet ...> Обзор (вкладка)> в поиске введите следующее: Microsoft.CodeDom.Providers.DotNetCompilerPlatform

Вы можете установить или обновить или удалить и установить этот компилятор

DotNetCompilerPlatform


8

Другое возможное решение:

Перезапустите экземпляр Visual Studio с правами администратора

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


4

Он остановился после публикации на рабочем сервере. Причина , по которой он показал мне эту ошибку потому , что он был развернут в суб папке. В IIS я нажал прямо на подпапку и извинился «Преобразовать в приложение», и после этого все заработало.


Конвертировать в приложение было все, что мне было нужно. (Это был новый проект, который раньше не публиковался.)
— Патрик

Использование подпапки было моей проблемой, поэтому я перешел в базовую папку, и все стало работать.
— J_L

4

В моем случае это произошло, когда я изменил разрешение для папки приложения и учетная запись IIS_IUSRS была удалена. После того, как я повторно добавил IIS_IUSRS (IIS Manager-> YourWebApp -> Редактировать разрешение -> Добавить IIS_IUSRS) в папку приложения, оно заработало.


Я добавил разрешения IUSR, но это было недостаточно. Мне пришлось добавить «IIS_IUSRS», и тогда это сработало.
— zacharydl

3

Вот как я решил это:

  1. Удалил binпапку в каталоге проекта.
  2. Нажмите на Build Solution. В VS2017 (Запуск от имени администратора)> Построить> Построить решение .


2

У меня было несколько проектов в решении, и веб-проект (проблема, приводящая к этой ошибке) не был установлен как проект запуска. Я установил этот веб-проект как проект автозагрузки и щелкнул пункт меню «Отладка» -> «Начать отладку», и он заработал. Я прекратил отладку, а затем попробовал снова, и теперь он снова работает. Weird.


2

Тогда проблема вернулась. Я удалил как Microsoft.CodeDom.Providers.DotNetCompilerPlatformи , Uninstall-package Microsoft.Net.Compilersно никакой помощи. Потом установил - не поможет. Очистили проект и построили без помощи. Перезапуск сервера не помог. Потом я заметил, что проекту нужен не самый последний, который в настоящее время 1.0.5, а 1.0.3, так как в этом случае ошибка не могла загрузить версию 1.0.3. Поэтому я установил эту версию DLL, и теперь она работает.


1

ASP.NET не выполняет поиск bin/debugили какую-либо подпапку в bin для сборок, как это делают другие типы приложений. Вы можете указать среде выполнения искать в другом месте, используя следующую конфигурацию:

<configuration>
   <runtime>   
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin\Debug;bin\Release"/>
      </assemblyBinding>
   </runtime>   
</configuration>

1

Вам следует обновить пакеты «Microsoft.CodeDom.Providers.DotNetCompilerPlatform» и «Microsoft.Net.Compilers» в вашем проекте.


1

В моем случае, я получил ошибку, когда у меня было веб-приложение в 4.5.2 и ссылочные библиотеки классов в 4.6.1. Когда я обновил веб-приложение до версии 4.5.2, ошибка исчезла.


Получилась действительно та же ошибка при установке Umbraco 8, для неправильной версии .Net (требуется 4.7.2) вместо 4.5.2 (по умолчанию VS 2017)
— Bunkerbuster

1

Я получил эту ошибку, потому что мой пользователь пула приложений был установлен на ApplicationPoolIdentity. Я изменил его на учетную запись пользователя / службы, которая имеет доступ к папке, и ошибка исчезла.


1

Вот мои выводы. Я также столкнулся с этой проблемой сегодня утром. Я просто добавил своего текущего пользователя в пул приложений, в котором выполнялось приложение.

шаги:

  1. Откройте IIS

  2. Нажмите на пул приложений

  3. Выберите пул приложений, в котором вы получаете проблему

  4. Правый клик -> дополнительные настройки

  5. Нажмите на значок в три точки рядом с изображением

  6. Теперь выберите свой аккаунт

  7. Дайте вашему компьютеру имя пользователя и пароль

  8. Сохранить

Обновите ваше приложение .. и оно начнет работать. Была некоторая проблема безопасности для доступа к dll.


1

просто удалите пакет из консоли диспетчера пакетов из команды ниже

PM> Удалить пакет Microsoft.CodeDom.Providers.DotNetCompilerPlatform.

PM> Удалить пакет Microsoft.Net.Compilers

а затем установить его снова из диспетчера нюгетеров введите описание изображения здесь


1

Если вы недавно установили или обновили Microsoft.CodeDom.Providers.DotNetCompilerPlatformпакет, дважды проверьте, что версии этого пакета, на которые есть ссылки в вашем проекте, указывают на правильную и ту же версию этого пакета:

  • В ProjectName.csproj, убедитесь , что <Import>тег для Microsoft.CodeDom.Providers.DotNetCompilerPlatformприсутствует и указывает на правильную версию.

  • В ProjectName.csproj, убедитесь , что <Reference>тег для Microsoft.CodeDom.Providers.DotNetCompilerPlatformприсутствует, и указывает на правильную версию, как в Includeатрибуте и ребенка <HintPath>.

  • В этом проекте web.configубедитесь, что <system.codedom>тег присутствует и его дочерние <compiler>теги имеют одинаковую версию в своем typeатрибуте.

По какой - то причине, в моем случае обновление этого пакета от 1.0.5 до 1.0.8 вызвало <Reference>тег в .csprojиметь свой Includeуказывающий на старую версию 1.0. 5 .0 (которые я удалил после обновления пакета), но все остальное указывало на новую и правильную версию 1.0. 8 .0.


1

Убедитесь, что ваш проект полностью построен!

Нажмите на вкладку «Вывод» и убедитесь, что у вас нет что-то вроде:

========== Перестроить все: 14 успешно выполнено, 1 не выполнено, 0 пропущено =========

И открой свой bin папку и проверьте, не устарела ли она.

У меня была целая куча ошибок машинописного текста, которые я сначала игнорировал, забывая, что они ломали сборку и приводили к тому, что не было скопированных DLL.



1

В моем случае мой веб-проект не был загружен должным образом (он показывал проект, недоступный), затем я должен был перезагрузить свой веб-проект после открытия моей визуальной студии в режиме администратора, тогда все работало нормально.


0

У меня была та же самая проблема, и это было потому, что я переместил местоположение проекта и просто нуждался в воссоздании виртуального каталога.


0

Исключение, с которым мы столкнулись, было не на локальном, а на удаленном сервере, CI Azure считывал его из папки пакетов, но упомянутые выше версии компилятора не были найдены.

Чтобы исправить это, мы изменили файл проекта, чтобы сделать его что-то вроде

Здесь нет ссылок ни на один из пакетов, прямо ссылающихся на переменные окружения.

Это решило проблему, однако в наших случаях мы не используем пакеты напрямую из «package.config», вместо этого у нас есть отдельная папка для обеспечения целостности версий между командами.


0

Перейдите в inetmgr из команды запуска. В консоли диспетчера IIS выберите папку приложения в разделе «Веб-сайт по умолчанию», щелкните правой кнопкой мыши эту папку, затем «Преобразовать в приложение». Запустите файл .asmx, активировав его. Это решило проблему.


0

Проверьте, BINзагружена ли папка полностью или отсутствует в файлах.


Я также сталкиваюсь с той же проблемой, совершенно новой для asp.net
— Prashant Pimpale

0

По поводу этой ошибки я пробовал:

  • Очистка и перестройка проекта
  • Разгрузка и перезагрузка проекта
  • Модификация целевой структуры
  • Изменение пути вывода
  • Добавление самородков в GAC
  • Удаление пакетов uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform uninstall-package Microsoft.Net.Compilersи их установка снова.

Хотя все они кажутся правильными решениями, я смог генерировать только новые ошибки, и, в конце концов, ошибка может отображаться, когда отсутствуют определенные ссылки / нюансы.

В моем случае я недавно переустановил Microsoft Office и ссылался на сборки, такие как Microsoft.Office.Core. Новая установка, казалось, не включала требуемые пакеты, что сделало его таким, что мое решение не могло быть построено правильно.

Я смог решить эту проблему, переработав свой код до такой степени, что мне не нужно было ссылаться на Microsoft.Office, но я мог бы решить эту проблему путем поиска необходимых пакетов и соответствующей установки.

Похоже, неясное сообщение об ошибке из Visual Studio.


0

Если вы работали над проектом, и это только что появилось как ошибка. Перезагрузите свой компьютер (или сервер в моем случае), это решило проблему для меня.

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