Haftungsausschluss : Ich arbeite für Microsoft im Roslyn-Team.
CodeDom ist ein Vorläufer von Roslyn, aber nur am Rande verwandt. Im Wesentlichen ist CodeDom eine einfache und (etwas) sprachunabhängige Methode zum Generieren von Code, der in .NET 1.0 hinzugefügt wurde, um Designer zu unterstützen (a la WinForms). Da CodeDom ein Versuch war, ein einheitliches Modell bereitzustellen, das Code in C #, VB und anderen Sprachen generieren kann, fehlt es an High-Fidelity mit einer der unterstützten Sprachen (aus diesem Grund können Sie mit CodeDom keine switch-Anweisung erstellen). CSharpCodeProvider.CompileAssemblyFromSource ist einfach ein Wrapper für die Ausführung von csc.exe.
Roslyn ist ein ganz anderes Tier. Es ist eine Neufassung der C # - und VB-Compiler von Grund auf unter Verwendung von verwaltetem Code - C # in C # und VB in VB (die Versionen von csc.exe und vbc.exe, die heute ausgeliefert werden, sind in nativem Code geschrieben). Der Vorteil der Erstellung in verwaltetem Code besteht darin, dass Benutzer die realen Compiler als Bibliotheken aus .NET-Anwendungen referenzieren können (keine Wrapper erforderlich).
Beim Erstellen jeder Komponente der Compiler-Pipeline haben wir oben öffentliche APIs verfügbar gemacht:
- Parser -> Syntax Tree API
- Import von Symboltabellen / Metadaten -> Symbol-API
- Binder -> Bindungs- und Flussanalyse-APIs
- IL Emitter -> API senden
Roslyn kann als hochentwickelter C # - und VB-Quellcodegenerator verwendet werden, aber hier endet die Ähnlichkeit mit CodeDom. Die Roslyn Compiler-APIs können verwendet werden, um Code zu analysieren, semantische Analysen durchzuführen, Code dynamisch zu kompilieren und auszuwerten usw.
Zusätzlich zu den Compilern erstellt das Roslyn-Team die Visual Studio C # - und VB IDE-Funktionen zusätzlich zu den öffentlichen Compiler-APIs neu. Die Compiler-APIs sind also umfangreich genug, um die Visual Studio-Entwurfszeit-Tools wie IntelliSense und das Refactoring der Extraktionsmethode zu erstellen. Auf Ebenen über dem Compiler bietet Roslyn außerdem Dienste für die Analyse oder Datentransformation auf höherer Ebene an. Beispielsweise gibt es Dienste zum Formatieren von Code unter Verwendung der C # - und VB-Formatierungsregeln oder zum Suchen aller Verweise auf ein bestimmtes Symbol in einer Lösung.
Wirklich, es gibt nicht nur einen besonderen Vorteil von Roslyn gegenüber CodeDom. Während CodeDom einen ganz bestimmten Bedarf an Codegenerierung erfüllte, befasst sich Roslyn mit dem gesamten Sprachwerkzeugbereich, indem es ein Framework bereitstellt, mit dem Sie nahezu jede Art von C # - oder VB-Sprachwerkzeug erstellen können, die Sie sich vorstellen können.
Mit CodeDom können Sie kompilieren, aber es gibt Ihnen nicht die Möglichkeit, wirklich Informationen über den Code selbst abzurufen (außer Compilerfehlern). Grundsätzlich handelt es sich um eine Black Box, in der Sie "Kompilieren" und "Ich habe es geschafft" oder "Ich habe versagt, hier sind einige Fehler" sagen.
Mit Roslyn können Sie den Code im laufenden Betrieb vollständig überprüfen und ausbauen. Dazu gehören Dinge wie das Anzeigen / Überprüfen der Kommentare in einem Quellcode, detaillierte Informationen zur vollständigen Struktur usw. Sie können den gesamten Syntaxbaum der Quelle, die Sie an Roslyn übergeben, abrufen und detaillierte Analysen durchführen oder Transformationen darauf.
Angesichts der vollständigen, umfassenden Syntaxinformationen verfügen Sie über eine enorme zusätzliche Kontrolle und Flexibilität. So funktioniert beispielsweise das Beispiel, das einen Block C # -Code kopiert und als VB.NET-Code einfügt. Mit Roslyn können Sie mehr als nur kompilieren - Sie können auch den Code selbst sauber bearbeiten. Dies sollte die Generierung vieler Tools erheblich vereinfachen, da Dinge wie Refactorings sehr einfach durchgeführt werden können, da das Tool die vollständige Syntax einschließlich Metainformationen (wie Kommentare) versteht und direkt damit arbeiten kann.
quelle
Ein großer Unterschied, den ich sehe: Mit CodeDom geschieht dies jedes Mal, wenn Sie C # oder VB.NET kompilieren, außerhalb des Prozesses. CSC.exe oder VBC.exe sind die wirklichen Arbeiter hinter den Kulissen.
Wenn Sie einen Dienst in Bezug auf Architektur, Skalierbarkeit, Isolation usw. erstellen möchten (Sie erwähnen Azure), ist dies nicht sehr gut.
Mit Roslyn ist es in Bearbeitung.
Ich nehme an, dies ist einer der Gründe, warum sie es "Compiler as a Service" nennen.
Außerdem ist CodeDom eine relativ schlechte API, es fehlen viele Funktionen und sie ist nicht wirklich auf dem neuesten Stand, da sie hauptsächlich zur Unterstützung der automatischen Codegenerierung von Visual Studio UI-Designern entwickelt wurde. Ich denke, Roslyn wird es viel besser machen, da es von den Leuten geschrieben wurde, die die Compiler schreiben. Ich hoffe, das wird den Unterschied machen.
PS: Ein bemerkenswerter Unterschied zu CSC.exe und VBC.exe: Roslyn scheint reines .NET zu sein (und verwendet CCI ).
quelle
Roslyn ermöglicht eine viel feinere Steuerung des gesamten Prozesses - zum Beispiel können Sie die Zeichenfolge analysieren und sogar zusätzlichen Code generieren (im laufenden Betrieb innerhalb des Kompilierungsprozesses basierend auf der Analyse) usw.
CodeDom verwendet "nur den Compiler", während Roslyn "Compiler als Dienst mit vollem Zugriff auf (Unter-) Teile" ist. Mit Roslyn befinden Sie sich "im Compiler" und können sehen, wie der Code aus Compilersicht aussieht So können Sie Dinge auf eine Weise ändern, die derzeit nicht möglich ist.
Sie können beispielsweise Roslyn verwenden, um C # zu erweitern - etwas sehr Praktisches und viel Besseres als der aktuelle Stand der AOP-Implementierung.
Eine Übersicht über den aktuellen Roslyn-Status und die verschiedenen Zugriffs- und Kontrollebenen finden Sie unter http://msdn.microsoft.com/en-us/hh500769
AKTUALISIEREN
Microsoft hat gerade ein neues CTP mit zusätzlichen Funktionen und vielen API-Änderungen / Ergänzungen verfügbar gemacht. Details finden Sie hier .
quelle
public notifying string Name {get;set;}
, wäre das noch großartiger