คำเตือน : ฉันทำงานให้กับ Microsoft ในทีม Roslyn
CodeDom เป็นสารตั้งต้นของ Roslyn แต่เกี่ยวข้องเพียงเล็กน้อยเท่านั้น โดยพื้นฐานแล้ว CodeDom เป็นวิธีที่ไม่เชื่อเรื่องพระเจ้าที่ง่ายและ (ค่อนข้าง) ภาษาในการสร้างโค้ดที่เพิ่มใน. NET 1.0 เพื่อสนับสนุนนักออกแบบ (a la WinForms) เนื่องจาก CodeDom เป็นความพยายามในการจัดหาโมเดลแบบรวมที่สามารถสร้างรหัสใน C #, VB และภาษาอื่น ๆ ได้จึงขาดความเที่ยงตรงสูงกับภาษาใด ๆ ที่รองรับ (นั่นคือเหตุผลที่คุณไม่สามารถสร้างคำสั่ง switch ด้วย CodeDom ได้) CSharpCodeProvider.CompileAssemblyFromSource เป็นเพียงเครื่องห่อหุ้มรอบการรัน csc.exe
Roslyn เป็นสัตว์ที่แตกต่างไปจากเดิมอย่างสิ้นเชิง เป็นการเขียนซ้ำของคอมไพเลอร์ C # และ VB ตั้งแต่เริ่มต้นโดยใช้รหัสที่มีการจัดการ - C # ใน C # และ VB ใน VB (เวอร์ชันของ csc.exe และ vbc.exe ที่จัดส่งในวันนี้จะเขียนด้วยรหัสดั้งเดิม) ข้อดีของการสร้างในโค้ดที่มีการจัดการคือผู้ใช้สามารถอ้างอิงคอมไพเลอร์จริงเป็นไลบรารีจากแอปพลิเคชัน. NET (ไม่จำเป็นต้องใช้ตัวห่อ)
ในขณะที่สร้างส่วนประกอบของคอมไพเลอร์ไปป์ไลน์เราได้เปิดเผย API สาธารณะที่ด้านบน:
- Parser -> Syntax Tree API
- Symbol Table / Metadata Import -> Symbol API
- Binder -> Binding และ Flow Analysis APIs
- IL Emitter -> Emit API
Roslyn สามารถใช้เป็นตัวสร้างซอร์สโค้ด C # และ VB ที่ซับซ้อนได้ แต่นั่นคือจุดสิ้นสุดของความคล้ายคลึงกับ CodeDom Roslyn Compiler API สามารถใช้เพื่อแยกวิเคราะห์โค้ดทำการวิเคราะห์เชิงความหมายรวบรวมและประเมินโค้ดแบบไดนามิก ฯลฯ
นอกเหนือจากคอมไพเลอร์แล้วทีม Roslyn ยังสร้างคุณลักษณะ Visual Studio C # และ VB IDE ขึ้นใหม่ที่ด้านบนของ API คอมไพเลอร์สาธารณะ ดังนั้น API ของคอมไพเลอร์จึงมีความสมบูรณ์เพียงพอที่จะสร้างเครื่องมือเวลาออกแบบของ Visual Studio เช่น IntelliSense และการปรับโครงสร้างวิธีแยกข้อมูล นอกจากนี้ที่เลเยอร์เหนือคอมไพเลอร์ Roslyn ยังมีบริการสำหรับการวิเคราะห์ระดับสูงขึ้นหรือการแปลงข้อมูล ตัวอย่างเช่นมีบริการสำหรับการจัดรูปแบบโค้ดโดยใช้กฎการจัดรูปแบบ C # และ VB หรือค้นหาการอ้างอิงทั้งหมดไปยังสัญลักษณ์เฉพาะภายในโซลูชัน
จริงๆแล้วRoslyn ไม่ได้มีประโยชน์พิเศษเพียงอย่างเดียวจาก CodeDom ในกรณีที่ CodeDom ตอบสนองความต้องการในการสร้างโค้ดที่เฉพาะเจาะจงมาก Roslyn กำลังจัดการกับพื้นที่เครื่องมือภาษาทั้งหมดโดยจัดเตรียมเฟรมเวิร์กเพื่อให้คุณสร้างเครื่องมือภาษา C # หรือ VB ประเภทใดก็ได้ที่คุณนึกออก