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

159

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

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

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

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

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

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

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

cscmh99
источник
Могу я спросить, почему вы изменили путь вывода вашего веб-приложения? Спасибо.
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>

vibs2006
источник
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.

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

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

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

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

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

Henry.K
источник
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 в месте развертывания независимо от настроек пути вывода. Я предполагаю, что ваше приложение все еще должно работать в реальном развертывании.

X-Мао
источник
10

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

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

DotNetCompilerPlatform

Newred
источник
8

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

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

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

Легенды
источник
4

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

Мартин Лиц
источник
Конвертировать в приложение было все, что мне было нужно. (Это был новый проект, который раньше не публиковался.)
Патрик
Использование подпапки было моей проблемой, поэтому я перешел в базовую папку, и все стало работать.
J_L
4

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

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

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

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

Если вы используете git, вы, вероятно, игнорируете .dll в коммите

Антонио Рейес
источник
2

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

TFA
источник
2

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

TFA
источник
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, ошибка исчезла.

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

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

user3822295
источник
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.

Simon_Weaver
источник
1

Добавьте ссылку на сборку CppCodeProvider.

каменщик
источник
1

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

Рупеш Кумар Тивари
источник
0

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

Стивен Т. Крамер
источник
0

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

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

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

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

Викас Шарма
источник
0

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

Прабха Раджан
источник
0

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

TechDo
источник
Я также сталкиваюсь с той же проблемой, совершенно новой для 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.

Wouter Vanherck
источник
0

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

MichaelDarkBlue
источник