Was / warum wird Roslyn im Ordner / bin von Asp.Net "benötigt"?

75

Es gibt eine Reihe verwandter Fragen dazu, obwohl die meisten Antworten Roslyn definieren und / oder eine "Lösung" für ein Problem bieten ( exebei Hosting-Anbietern usw.).

Was ich anscheinend nicht finden kann, ist das "Warum" und "Wofür" (möglicherweise nur im Kontext der ASP.Net MVC / Web API) in /bin/roslyn.

Ich bin auf ähnliche Probleme gestoßen (Hosting - .exeEinschränkungen, Unterstützung für 4.6usw.) und mein "Fix" bestand darin, "nur in Azure bereitzustellen" (natürlich funktioniert alles reibungslos). Aber das antwortet wirklich nicht:

  • warum werden sie gebraucht?
  • Bedeutet dies, dass sie für die runtimeKompilierung verwendet werden (mein Gehirn zeigt darauf, aber das ist eine vollständige Vermutung / mein vielleicht falscher Grok), wie dieser SO-Beitrag zeigt - sofern nicht korrigiert, ist dies "es" (weiter unten).
  • Es scheint, dass "Entfernen des Pakets" ein "Fix" ist (basierend auf einigen früheren Antworten) , aber wenn ja, wirft es die Frage (erneut) auf

Ich denke, das zu verstehen wird helfen - zB kann ich nicht der einzige sein, der eine hochgezogene Augenbraue hat und ein .exe"gebrauchtes" sieht ...


Aktualisieren

Zeigt, dass es "versteckte Juwelen" gibt :) Ich habe das immer und immer wieder gelesen ... schließlich ist es schon seit einiger Zeit da - aber nicht der Kommentarthread - der ursprüngliche Link, auf den verwiesen wird, circa 2014, wurde von neu gestaltet Microsoft und die Kommentare werden nicht mehr angezeigt ... zum Glück sind die relevanten Teile unten.

GROSSER Fehler - es starrte mich die ganze Zeit an (oder zumindest seit diesem Austausch):

Dmitry Dzygin 2. Juni 2015 00:53

Ich habe die neueste Version des NuGet-Pakets ausprobiert, aber es scheint einen Unterschied in der Art und Weise zu geben, wie der Compiler geladen / ausgeführt wird.

In Version 0.2.0.0 wird der Roslyn-Compiler in den Speicher geladen, wodurch die Leistung für nicht vorkompilierte Websites mit mehreren * .as * x / *. Cshtml-Dateien erheblich verbessert wird. Die neue Version enthält jedoch eine neue /bin/roslyn/csc.exeDatei, die einmal pro Datei ausgeführt wird, wodurch die oben erwähnte Optimierungsfunktion vollständig entfernt wird.

Gold:

XMao 2. Juni 2015 13:22 Uhr

@Dmitry Die Aufgabe des csc.exeIn /bin/Roslynbesteht darin, das aufzurufen VBCSCompiler.exe, das sich im selben Ordner befindet. VBCSCompiler.exe ist der Prozess, der die eigentliche Kompilierungsarbeit erledigt. Wenn der VBCSCompiler bereits ausgeführt wird, wird csc.exe ihn wiederverwenden und somit die erwähnte Leistungsverbesserung erzielen.

Hth ...


Update: 10/2017

Scheint dies nach all dieser Zeit relevant zu sein, also ein weiteres Update.

Die Antwort unten von @Donny V ist eine Option . Wenn Sie Ihre Anwendung einschließlich aller Views( .cshtml/ .vbhtml) vollständig kompilieren, benötigen Sie dies nicht exein Ihrer Anwendung.

Dies gilt auch , wenn Visual Studio (bis heute, VS 2017 zum Verwechseln) wird noch schafft die /bin/roslynund der Inhalt in dem PublishProzess, auch wenn „vollständige Compilierung“ gesetzt ist .

Sie können dies testen , indem ohne den /bin/roslynOrdner und seinen Inhalt , wenn die Anwendung auf Ihrem Hosting - Anbieter drängen.

Vorsichtsmaßnahme :

Wie bereits erwähnt, bedeutet das vollständige Kompilieren Ihrer Anwendung, dass Sie sie auch bei ViewÄnderungen der Ebene neu kompilieren müssen .

EdSF
quelle
Verwenden Sie Entity Framework?
Jeroen Vannevel
@JeroenVannevel - nicht speziell im Moment, aber die Bits sind da und bereit ...
EdSF
Also wird EF als Referenz zum Projekt hinzugefügt? Bis vor kurzem war PR EF von Roslyn abhängig.
Jeroen Vannevel
1
@JeroenVannevel ja, aber wenn Speicher dient, war es vom Standardgerüst (es sei denn, ich habe ein Nuget-Update auf "neueste" EF durchgeführt). Trotzdem verstehe ich die Beziehung zum "Benötigen" einer ausführbaren Datei ( .exe) in der Bereitstellung nicht - vielleicht nur die Bibliotheken / DLL, aber was muss von einer exein der Bereitstellung ausgeführten Umgebung ausgeführt werden ?
EdSF
1
@PederRice Dies kann von allen MS-Leuten in SO korrigiert werden . Wenn Sie ein Hosting - Ausgabe (einengt haben exe) Sie könnten diese Pakete in Ihrem Projekt entfernen , aber wenn Sie das tun, müssen Sie Ihren Code debuggen - wenn Sie einige neue Funktionen verwenden oder solche mit Roslyn Abhängigkeiten, die Dinge brechen. Leider ist es "sicher", darauf zurückzugreifen. 4.5.xDies ist mein persönlicher "Fix", wenn ein Projekt nicht für die Azure-Bereitstellung vorgesehen ist.
EdSF

Antworten:

34

Dies stammt aus dem MSDN-Forum.
https://social.msdn.microsoft.com/Forums/vstudio/en-US/442b100a-2b88-4ac4-b655-0c1345791f15/roslyn-cscexe-web-api-2-on-hosting-server?forum=msbuild

Ich habe einen kleinen Nachteil bei der Deinstallation dieses Pakets festgestellt:

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

Einige der neuen C # 6.0-Sprachfunktionen werden bei Verwendung in Ansichten (MVC-Projekt) nicht kompiliert. Viele meiner Ansichten verwenden das ?. Nullprüfungsoperator für den Zugriff auf Modelleigenschaften. Alle diese Ansichten geben jetzt Fehler in meiner von Godaddy gehosteten MVC 5-Anwendung zurück.

Dieser Fehler tritt auf, weil Ansichten (standardmäßig) zur Laufzeit mithilfe der .NET-Pipeline kompiliert werden (nicht vorkompiliert).

Um dieses Problem zu beheben, deaktivieren Sie einfach die Option "Vorkompilierte Site aktualisieren lassen" in Ihren Veröffentlichungsprofileinstellungen. Dies sollte Ihre Ansichten vorkompilieren und es Ihrem C # 6.0 (neueste Version von Roslyn Compiler) ermöglichen, wie ein Champion zu laufen.

Ich wollte nur, dass jeder, der sich diese Frage ansieht, weiß, wie sich die Deinstallation auswirkt und warum sie überhaupt vorhanden ist

Donny V.
quelle
Vielen Dank. Das bedeutet so ziemlich, dass die gesamte Site kompiliert wird (einschließlich der Front-End- vb/cs/htmlAnsichtsdateien, sodass dies möglicherweise nicht für alle praktikabel ist (Sie müssen die gesamte Site neu kompilieren, um "einfache" Front-End-Änderungen vorzunehmen, die Ansichten berühren). Außerdem habe ich zuletzt "veröffentlicht" ", auch wenn" full compile "eingeschaltet ist, werden die exeDateien immer noch in /bin/roslyn.....
EdSF
3
Ich wollte nur, dass jeder, der sich diese Frage ansieht, weiß, wie sich die Deinstallation auswirkt und warum sie überhaupt vorhanden ist.
Donny V.
Wenn Sie Postbacks mit dynamischen Daten erstellen, wird Ihre Site dadurch beschädigt.
John Lord
9

Dieses Problem trat in der Visual Studio 2017 Community Edition ständig auf, wo das Projekt nicht neu erstellt werden konnte, da die älteren Dateien in bin / roslyn nicht gelöscht werden konnten. Basierend auf dem Gold-Kommentar des OP lasse ich jetzt den Task-Manager geöffnet (Strg + Umschalt + Esc) und beende den VBCS.exe-Prozess. Die fehlerhaften Dateien in bin / roslyn können jetzt gelöscht werden.

Manish
quelle
1

Ein weiteres Merkmal ist, dass Build-Server keine Compiler-Abhängigkeiten aufweisen müssen. Sie senden den Compiler, den Sie mit dem Code verwenden möchten, an den Build-Server und er verwendet genau das, was Sie ihm gesagt haben.

Paul Swetz
quelle
1
Vielen Dank, wenn auch verwirrt. Das exeIn bin/roslynwird im Rahmen des "Publizierens" einer Asp.Net-App ( bereits kompiliert / erstellt) erstellt.
EdSF
1
Die Roslyn-Komponenten kommen ebenfalls über Referenz- und Nugget-Pakete in die Quelle, sodass sie für das Gebäude verwendet werden können. Das Material in bin, von dem ich glaube, dass es für alles verwendet wird, was mit JIT (Razor) zu tun hat, und auch, um auf dem System von MSIL zu native zu wechseln Ausführen der Anwendung.
Paul Swetz
0

Diese Version von Visual Studio enthält eine neue Version des C # & VB.net-Compiler-Codes mit dem Namen "Roslyn".

Roslyn ist eine vollständige Neufassung der C # - und VB.net-Compiler, wobei jeder in seiner jeweiligen Sprache geschrieben ist. Beispielsweise ist der C # -Compiler in C # und nicht in C ++ geschrieben. Roslyn ist Open Source (Roslyn auf GitHub), sodass Sie theoretisch sogar Ihre eigene Version von C # oder VB.net erstellen können!

Was Roslyn werden sollte, wurde bereits 2008 von Anders Hejlsberg auf der PDC-Konferenz erwähnt. Erst 2011 wurde die erste Vorschau veröffentlicht.

Unter den folgenden Links finden Sie detailliertere Informationen zu Ihrem Problem.

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

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

Prime
quelle
Vielen Dank. Ich denke, das "Was" war klar, es war das "Warum" und insbesondere, warum eine ausführbare Datei ( exe) in einem Webanwendungskontext benötigt wird, selbst wenn die Webanwendung vollständig kompiliert wurde - mit anderen Worten, es gibt " Zur Laufzeit bleibt nichts "zum Kompilieren übrig (alles ist bereits vorkompiliert ) - wobei das Verwerfen / Ausschließen des gesamten Roslyn-Ordners nur" in Ordnung "ist.
EdSF
0

Zwei Dinge, die zu beachten sind: 1) Durch Entfernen wird das Problem "behoben", aber es wird "behoben", indem auf einen integrierten, alten Legacy-Compiler zurückgegriffen wird, der nicht mit späteren Sprachfunktionen kompatibel ist.
2) Eine Vorkompilierung ist in vielen Fällen nicht möglich. Wie würden Sie Informationen in einem Modell anzeigen, wenn es vorkompiliert ist, und dann Änderungen an diesen Daten anzeigen? Alle Daten, auf die Sie sich in Teilansichten zum Aktualisieren verlassen, werden niemals aktualisiert.

Ein weiterer interessanter Punkt ist, sicherzustellen, dass Sie das "Build" -Verzeichnis im Paket von Roslyn verfolgen. Wenn Sie dies nicht tun, wird kein Fehler ausgegeben, aber Ihre Site wird nicht kompiliert, wenn Sie versuchen, sie zu laden. Vollständig verfolgt, funktioniert es einfach. Wir haben es auf anderen Entwicklungssystemen bereitgestellt, ohne es zuerst auf diesen Systemen zu installieren. Dies ist möglich, da es sich um ein NuGet-Paket handelt.

John Lord
quelle
Wenn diese Funktionen nicht kritisch sind, ist Fallback kein großes Problem.
EdSF
Was Nummer 2 betrifft, sind Sie sich nicht sicher, was Sie meinen. Abgesehen von der angegebenen Notwendigkeit, alle Quelländerungen neu zu kompilieren, gibt es keine weiteren Probleme.
EdSF
Jedes Sprachfeature kann umgangen werden. Beispiele, die uns dazu gebracht haben, unsere zu aktualisieren, wären die Nulloperatoren? und ??. Es ist sauberer, Objekt? .Wert ?? 0 vs if (object == null || object.value == null) 0 else object.value.
John Lord
Was # 2 betrifft, sage ich, dass Sie nichts mit dynamischen Daten vorkompilieren können. Angenommen, ich zeige "Fahrerinformationen". Wie würde ich das vorkompilieren? Ich weiß nicht im Voraus, um welchen Fahrer es sich handelt. Ich nehme an, Sie könnten die Daten später mit jquery abrufen, aber das ist normalerweise nicht notwendig. Wenn auf Ihrer Seite ein Modell vorhanden ist, können Sie keine Vorkompilierung durchführen.
John Lord
# 2 Nein. Es gibt keinen "funktionalen" Unterschied beim (Vor-) Kompilieren Ihrer gesamten Anwendung als nicht. Alle Funktionen, die Ihr Modell dynamisch erstellen (Benutzereingaben usw.), werden unverändert ausgeführt.
EdSF