Тип постачальника CodeDom “Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider” не вдалося знайти


159

Це проект WebApi, що використовує VS2015.

Крок для відтворення:

  1. Створіть порожній проект WebApi
  2. Змінити вихідний шлях складання з "бін \" на "бін \ налагодження \"
  3. Біжи

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

Все працює прекрасно, поки я не змінив шлях виведення збірки з "бін \" на "бін \ налагодження \" Насправді, будь-який вихідний шлях, окрім "бін \", не працюватиме.

Ще однією додатковою річчю є те, що мати інший вихідний шлях до будь-якого місця буде працювати до тих пір, поки я не залишив збірку у "біні".

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


Чи можу я запитати, чому ви змінили вихідний шлях веб-програми? Дякую.
X-Mao

Цей виняток трапляється зі мною щоразу, коли я оновлюю раніше запущену програму ASP.NET MVC під час компіляції msbuild .
Микола Костов

Те саме трапилось і зі мною. Це почалося після того, як я додав посилання на пару бібліотек .dll. Я виправив це, видаливши та повторно встановивши бібліотеки. І поняття не маю, чому так сталося ..
Letie Techera

Відповіді:


127

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

Щоб вирішити цю проблему, вам потрібно буде видалити компілятор Roslyn із шаблону проекту . Видалення Roslyn не повинно впливати на функціональність вашого коду. Це добре працювало для мене та деяких інших проектів (C # 4.5.2), над якими я працював.

Виконайте наступні дії:

  1. Видаліть з наступних Nuget Packages, використовуючи показаний нижче командний рядок ( або ви можете використовувати GUI менеджера Nuget Package, натиснувши правою кнопкою миші на 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> вище також призвело до усунення цієї проблеми. Я хотів би знати, як на землі це відбувається і чи є краще рішення. Я вважаю, що це не неймовірно, що ви не можете розгорнути додаток привіт, таким чином, не стикаючись із проблемами, подібні MS не роблять тестування: -)
user2728841

4
Щоб увімкнути Roslyn, ви можете прочитати наступну статтю Включення платформи компілятора .NET (“Roslyn”) у додатках ASP.NET Чому компіляція Roslyn в ASP.NET? Увімкнення нових компіляторів Roslyn у вашій програмі ASP.NET призведе до двох основних переваг: * Підтримка нових мовних функцій * Потенційно покращений час запуску /
передкомпіляції програми

1
Коли я створив новий веб-проект, у ньому з’явилися ті посилання, які вже є. Чому вони встановлені за замовчуванням, яке їх призначення? Наскільки я розумію, Рослін є новим компілятором C #. Як його видалення не порушує Visual Studio?
Єнс Мандер

@JensMander - це тривалість компіляції. У IIS нам потрібно вручну включити Roslyn Compiler. Ознайомтесь із посиланням у моєму попередньому коментарі щодо статті'Enabling the .NET Compiler Platform.
vibs2006,

У мене була така ж помилка, нарешті оновлений останній пакет для Microsoft.CodeDom.Providers.DotNetCompilerPlatform для мене вирішений.
Червоний

48

Будьте уважні, дотримуючись порад цієї відповіді. Незважаючи на те, що вона вирішує проблему, вона може пізніше спричинити різні проблеми.

У мене така ж проблема. Мабуть, компілятор .NET не завантажувався в GAC. Що я зробив для її вирішення:

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

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

Тепер чомусь приємні панове в Microsoft вирішили не встановлювати його в GAC для нас. Це можна зробити вручну, відкривши командний рядок Developer і ввівши:

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

Висновок

Майкрософт намагається заохотити всіх робити все з нагетами, які могли б бути нормальними без випадкових помилок, з якими ви стикаєтесь з системою nuget. Спробуйте використати один і той же проект на різних рішеннях, випадково (або ні) оновіть один із безлічі цілей, які він використовує на одному з них, і якщо вам не пощастить, ви побачите, що я маю на увазі, коли ви намагаєтеся побудувати інше рішення. З іншого боку, розміщення файлів у GAC також може спричинити майбутні проблеми, оскільки люди, як правило, забувають, що вони туди поміщають, а потім при створенні нових середовищ забувають включати ці файли. Ще одне можливе рішення - помістити файли в центральну папку для сторонніх dll (навіть якщо дивно називати компілятор сторонньою стороною), що створює проблеми зі зламаними посиланнями під час налаштування нових середовищ. Якщо ви вирішили встановити dll в GAC, будьте обережні і пам’ятайте, що ви це зробили. Якщо ви цього не зробите, завантажте нут для кожного проекту ще раз і переносьте всі дратівливі помилки, викликані ним (принаймні, колись це траплялося, коли я, нарешті, захворів і просто помістив файли в GAC). Обидва підходи можуть створити головні болі та створити проблеми, це лише питання, з якими проблемами ви хочете мати справу. Microsoft рекомендує використовувати систему nuget, і, як правило, краще слухати їх, ніж до невідомого програміста в SO, якщо ви зовсім не хворієте на логістичну систему і не працювали з GAC досить довго, щоб вона була кращою альтернативою для вас. завантажуйте нут для кожного проекту ще раз і несуть усі набридливі помилки, викликані ним (принаймні, це бувало, коли я, нарешті, захворів на нього і просто помістив файли в GAC). Обидва підходи можуть створити головні болі та створити проблеми, це лише питання, з якими проблемами ви хочете мати справу. Microsoft рекомендує використовувати систему nuget, і, як правило, краще слухати їх, ніж невідомий програміст в SO, якщо ви зовсім не хворієте на логістичну систему і не працювали з GAC досить довго, щоб вона була кращою альтернативою для вас. завантажуйте нут для кожного проекту ще раз і несуть усі набридливі помилки, викликані ним (принаймні, це бувало, коли я, нарешті, захворів на нього і просто помістив файли в GAC). Обидва підходи можуть створити головні болі та створити проблеми, це лише питання, з якими проблемами ви хочете мати справу. Microsoft рекомендує використовувати систему nuget, і, як правило, краще слухати їх, ніж невідомий програміст в SO, якщо ви зовсім не хворієте на логістичну систему і не працювали з GAC досить довго, щоб вона була кращою альтернативою для вас.


40
Це не повинно бути в GAC. Вся справа в підході Nuget полягає в тому, щоб ваш проект використовував конкретну версію C # або VB.NET, не змінюючи нічого в хост-системі. Дивіться цю публікацію від Даміана Едвардса з MSFT: blogs.msdn.microsoft.com/webdev/2014/05/12/…
Sudhanshu Mishra

29
Ці збори НЕ належать до періоду GAC. Якщо розмістити їх в GAC, це призведе до можливого головного болю, коли хтось, кому потрібно підтримувати ваш код, не зможе визначити, чому використовується неправильний компілятор.
EKW

5
-1 для зауважень Microsoft. Наче це круто робити це в наші дні. До речі, нюгети мають багато переваг, які зробили їх дуже популярними, які ви просто ігноруєте. А тепер уявіть, що з цього приводу думають господа Майкрософт.
Фабіо Мілхейро

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

2
GAC'ing ця залежність - це найдивовижніша річ, яку я бачив за деякий час.
Свенд

31

Просто додайте наступний пакунок нута до свого проекту - Microsoft.CodeDom.Providers.DotNetCompilerPlatform.

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


Просто будьте трохи обережні; він перезаписує "compilerOptions" в web.config, тому переконайтеся, що ви зберігаєте будь-які власні значення перед установкою.
Раддерз

19

У мене така ж проблема, що моя програма працювала у Vs2013, але отримувала помилку після оновлення до Vs2015.

  1. У Vs2015 клацніть правою кнопкою миші папку «Список літератури», щоб відкрити NuGet Package Manager
  2. На вкладці Огляд знайдіть "DotNetCompilerPlatform" і встановіть "Microsoft.CodeDom.Providers.DotNetCompilerPlatform"

2
Дякуємо за підказку, клацнувши правою кнопкою миші папку "Посилання" проекту, щоб відкрити менеджер пакунків
garyh

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
Рорі Маккросан

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

Простий спосіб - Проект> Керування пакетами 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", і тоді це спрацювало.
зачардл

3

Ось як я це вирішив :

  1. Видалено bin папку в каталозі проекту.
  2. Натисніть на Build Solution. У VS2017 (запуск адміністратора)> Створення> Збірка рішення .


2

У мене було декілька проектів у рішенні, і веб-проект (проблема з даною помилкою) не був встановлений як проект StartUp. Я встановив цей веб-проект як проект StartUp, і натиснув на пункт меню "Налагодження" -> "Почати налагодження", і він спрацював. Я припинив налагодження, а потім спробував її ще раз, і тепер вона працює. Дивно.


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будь-якій підпапці під біном для збірок, як це роблять інші типи програм. Ви можете доручити виконувати час пошуку в іншому місці, використовуючи таку конфігурацію:

<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

а потім знову встановити його з nuget manager введіть тут опис зображення


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>тег у the .csprojмає його Includeвказівку на стару версію 1.0. 5 .0 (яке я видалив після оновлення пакета), але все інше вказувало на нову і правильну версію 1.0. 8 .0.


1

Переконайтеся, що ваш проект повністю побудований!

Перейдіть на вкладку "Вихід" та переконайтесь, що у вас немає чогось типу:

========== Перебудувати все: 14 вдалося, 1 не вдалося, 0 пропустили ==========

Відкрийте binпапку і перевірте, чи вона актуальна.

У мене був цілий ряд помилок машинопису, які я ігнорував спочатку, забуваючи, що вони порушують збірку і призводять до того, що не копіюються файли DLL.



1

У моєму випадку мій веб-проект не завантажений належним чином (він показував, що проект недоступний), тоді мені довелося перезавантажити веб-проект після відкриття моєї візуальної студії в режимі адміністратора, тоді все працювало нормально.


0

У мене просто була така ж проблема, і це було тому, що я перемістив місце розташування проекту і просто потрібно було відтворити віртуальний каталог.


0

Виняток, в який ми стикалися, був не на локальному, а на віддаленому сервері, Azure CI читав його з папки пакетів, але версії компілятора, згадані вище, не знайдені.

Щоб виправити це, ми змінили файл проекту, щоб він став чимось подібним

Тут не посилається жоден з пакетів, що безпосередньо посилаються на змінні середовища.

Це вирішило проблему, однак у наших випадках ми не використовуємо пакунки безпосередньо з "package.config", а замість цього ми маємо окрему папку для підтримки цілісності версій для команд.


0

Перейдіть до inetmgr від команди start У консолі менеджера 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.