Що / навіщо Roslyn «потрібна» у папці / bin на Asp.Net


75

Існує купа пов’язаних з цим питань , хоча більшість відповідей визначають Roslyn та / або надають «виправлення» певної проблеми ( exeіз хостинг-провайдерами тощо)

Що я, здається, не можу відстежити, це "чому" і "для чого" (можливо, лише в контексті ASP.Net MVC / Web API) в /bin/roslyn.

Я стикався з подібними проблемами (хостинг - .exeобмеження, підтримка 4.6тощо), і моїм "виправленням" було "просто розгорнути в Azure" (звичайно, все працює без затримок). Але насправді це не відповідає:

  • навіщо вони потрібні?
  • чи означає це, що вони використовуються для runtimeкомпіляції (мій мозок вказує на це, але це цілковита здогадка / мій, можливо, неправильний грок), як показує ця публікація SO - якщо це не виправлено, це "це" (докладніше нижче).
  • здається, "видалення пакету" є "виправленням" (на основі деяких минулих відповідей) , але якщо так, то (повторно) виникає питання

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


Оновлення

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

ВЕЛИКА помилка - вона дивилася на мене весь цей час (або принаймні з цього обміну):

Дмитро Дзигін 2 червня 2015 00:53

Я спробував останню версію пакета NuGet, але, схоже, є різниця в способі завантаження / виконання компілятора.

У версії v0.2.0.0 компілятор Roslyn буде завантажений в пам'ять, що значно покращить продуктивність для попередньо скомпільованих веб-сайтів із декількома файлами * .as * x / *. Cshtml. Однак нова версія містить новий /bin/roslyn/csc.exeфайл, який виконується один раз на файл, повністю видаляючи згадану вище функцію оптимізації .....

Золото:

XMao 2 червня 2015 р. 13:22

@Dmitry Завданням csc.exein /bin/Roslynє виклик VBCSCompiler.exeфайлу, який знаходиться в одній папці. VBCSCompiler.exe це процес, який виконує фактичну роботу з компіляції. Якщо VBCSCompiler вже працює, csc.exe буде використовувати його повторно, і, отже, ми все одно отримаємо згадане покращення продуктивності.

Hth ...


Оновлення: 10/2017

Здається, це актуально після всього цього часу, тому подальше оновлення.

Відповідь знизу @Donny V є варіантом . Повною компіляцією вашої програми, включаючи всі Views( .cshtml/ .vbhtml), вам це не знадобиться exe.

Це вірно, навіть якщо Visual Studio (на сьогоднішній день, VS 2017, заплутано) все одно створить /bin/roslynі його вміст у Publishпроцесі, навіть якщо встановлено "повне компілювання" .

Ви можете перевірити це, за винятком в /bin/roslynпапці і його вміст при натисканні додатки на ваш хостинг - провайдер.

Застереження :

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


Ви використовуєте Entity Framework?
Jeroen Vannevel

@JeroenVannevel - не конкретно на даний момент, але біти є і готові ...
EdSF

Тож EF додається як посилання на проект? Аж до останнього часу PR EF не має залежності від Росліна.
Jeroen Vannevel

1
@JeroenVannevel так, хоча, якщо пам'ять служить, це було за допомогою типових риштувань (якщо я не зробив оновлення Nuget до "останнього" EF). Досі я не розумію його відношення до "необхідності" виконуваного файлу ( .exe) у розгортанні - можливо, лише бібліотеки / dll, але що має виконувати середовище exeв розгортанні ?
EdSF

1
@PederRice Це може бути виправлено будь-яким представником MS в SO . Якщо у вас проблема з хостингом (обмежує exe), ви можете видалити ці пакети у своєму проекті , але якщо це так, вам потрібно налагодити ваш код - якщо ви використовуєте деякі нові функції або функції із залежностями від Roslyn, справи зламаються. На жаль, "безпечним" способом є повернення до 4.5.x- це моє особисте "виправлення", якщо проект не планується для розгортання Azure.
EdSF

Відповіді:


34

Це взято з форуму MSDN.
https://social.msdn.microsoft.com/Forums/vstudio/en-US/442b100a-2b88-4ac4-b655-0c1345791f15/roslyn-cscexe-web-api-2-on-hosting-server?forum=msbuild

Я помітив незначний недолік видалення цього пакета:

https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform

Деякі нові мовні функції C # 6.0, якщо вони використовуються у поданнях (проект MVC), не компілюються. Багато моїх поглядів використовують?. оператор перевірки нуля для доступу до властивостей моделі. Усі ці подання тепер повертають помилки в моєму додатку MVC 5, розміщеному в Godaddy.

Ця помилка виникає через те, що подання (за замовчуванням) компілюються під час виконання за допомогою конвеєра .NET (не попередньо скомпільований).

Щоб вирішити цю проблему, просто зніміть прапорець «Дозволити попередньо скомпільований сайт оновлюватись» у налаштуваннях вашого профілю публікації. Це повинно попередньо скомпілювати ваші погляди та дозволити вашому C # 6.0 (остання версія Roslyn Compiler) працювати як чемпіон.

Просто хотілося, щоб хтось, хто дивиться на це питання, знав наслідки його видалення та навіщо це взагалі


Дякую. Це майже означає, що весь веб-сайт скомпільований (включаючи vb/cs/htmlфайли зовнішнього вигляду, тому це може бути непрацездатною ситуацією для всіх (доведеться перекомпілювати весь сайт для "простих" змін в інтерфейсі, що стосуються переглядів). Також, останнє, що я "опублікував ", навіть при exe/bin/roslyn
включеному

3
Просто хотілося, щоб хтось, хто дивиться на це питання, знав наслідки його видалення та чому це взагалі існує.
Донні В.

якщо ви формуєте зворотний зворотний зв'язок з динамічними даними, це зламає ваш сайт.
Джон Лорд,

9

Цю проблему постійно стикався у Visual Studio 2017 Community Edition, де проект не вдалося відновити, оскільки старі файли в bin / roslyn не можна було видалити. На основі золотого коментаря ОП, я тепер тримаю Диспетчер завдань відкритим (Ctrl + Shift + Esc) і вбиваю процес VBCS.exe. Файли, що порушують дію в bin / roslyn, тепер можна видалити.


1

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


1
Спасибі, хоч розгублений з цього приводу. exeУ bin/roslynстворенні в рамках «видавництва» розроблена на Asp.Net ( вже скомпільовано / вбудований).
EdSF

1
Компоненти Roslyn потрапляють у джерело також через посилання та самородкові пакети, щоб їх можна було використовувати для будівлі, речі в контейнері, я вважаю, використовуються для будь-чого JIT'd (Razor), а також для переходу від MSIL до рідного в системі запуск програми.
Пол Швец

0

Цей випуск Visual Studio містить нову версію коду компіляторів C # & VB.net під назвою “Roslyn”.

Roslyn - це повний перепис компіляторів C # та VB.net, кожен з яких написаний відповідною мовою, наприклад, компілятор C # написаний на C #, а не на C ++. Roslyn є відкритим кодом (Roslyn на GitHub), тому ви навіть теоретично можете створити власну версію C # або VB.net!

Що стане Росліном, вперше було згадано ще в 2008 році Андерсом Хейлсбергом на конференції PDC, однак лише в 2011 році був опублікований перший попередній перегляд.

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

https://gooroo.io/GoorooTHINK/Article/16253/Visual-Studio-2015-and-Roslyn-Compiler/17944#.VmkfwjaheM8

https://visualstudiomagazine.com/articles/2012/03/20/10-questions-10-answers-on-roslyn.aspx

З: https://forums.asp.net/t/2079727.aspx?What+is+the+roslyn+folder+


Дякую. Я думаю, що "що" було зрозумілим, це було "чому", а конкретніше, навіщо потрібен виконуваний файл ( exe) у контексті веб-програми, навіть коли веб-програма була повністю скомпільована - іншими словами, є " нічого "не залишається під час виконання для компіляції (все вже попередньо скомпільовано ) - де відмова / виключення всієї папки roslyn є просто" чудовим ".
EdSF

0

Дві речі, на які слід звернути увагу: 1) Видалення цього дозволить "виправити" проблему, але "виправити" це, повернувшись до вбудованого, старого, застарілого компілятора, який не сумісний з наступними функціями мови.
2) Попереднє складання неможливо у багатьох випадках. Як би ви показали інформацію в моделі, якщо вона попередньо скомпільована, а потім показали зміни до цих даних? Будь-які дані, на які ви покладаєтеся в часткових поданнях для оновлення, ніколи не оновлюються.

Інший цікавий момент - переконатися, що ви відстежуєте каталог "build" у пакеті roslyn. Якщо ви цього не зробите, це не призведе до помилки, але не скомпілює ваш сайт при спробі завантажити його. Повністю відстежується, це просто працює. Ми розгорнули його в інших системах розробки, не попередньо встановивши на цих системах, і це можливо, оскільки це пакет NuGet.


Якщо ці функції не є критичними, запасний варіант насправді не є великою проблемою.
EdSF

Що стосується №2, не впевнені, що ви маєте на увазі - крім заявленої необхідності перекомпілювати всі зміни джерела, інших питань немає.
EdSF

будь-яку функцію мови можна опрацювати. Прикладами, через які ми захотіли оновити наш, є нульові оператори? і ??. Чистіше сказати об'єкт? .Value ?? 0 проти if (object == null || object.value == null) 0 else object.value.
Джон Лорд

що стосується №2, я кажу, що ви не можете попередньо скомпілювати нічого, що має динамічні дані. Скажімо, я показую "інформацію про водія". Як би я попередньо скомпілював це? Я не знаю заздалегідь, який це водій. Припускаю, ви могли б отримати дані згодом за допомогою jquery, але це, як правило, непотрібно. Якщо на вашій сторінці є модель, ви не можете попередньо скомпілювати.
Джон Лорд

No2 Ні. Існує ніяка "функціональна" різниця у (попередньому) складенні всього вашого додатка, ніж ні. Усі функції, які динамічно будують вашу модель (введення користувачем тощо), працюють як є.
EdSF
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.