首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 動態編譯執行與偵錯:從原始碼到即時實例的完整方案

     編輯:關於C#

動態編譯讓應用程式具備腳本化擴充能力。本文封裝 CSharpProvider 類別,整合原始碼編譯、實例建立、應用程式域隔離與 Visual Studio 偵錯支援,解決記憶體洩漏與重複編譯效能問題。

核心類別設計

公開屬性

public string AssemblyFileName { get; set; }        // 輸出組件名稱
public CompilerParameters CompilerParameters { get; } // 編譯參數
public StringCollection References { get; }           // 參考組件集合
public Encoding SourceCodeFileEncoding { get; set; }  // 原始碼檔案編碼

智慧參考管理:System.* 命名空間自動載入;使用者組件若未手動指定,嘗試依命名空間推測組件檔名。

核心方法

// 從字串編譯
public bool Compile(string code)

// 從檔案編譯(支援偵錯)
public bool CompileFromFile(string sourceCodeFileName)

// 建立實例(依型別全名或介面型別)
public object CreateInstance(string code, string typeFullName)
public object CreateInstanceFromFile(string fileName, string typeFullName)

應用程式域隔離:防止記憶體洩漏

動態載入的程式碼必須繼承 MarshalByRefObject,否則主應用程式域會持有子域參考導致無法卸載:

[Serializable]
public class HelloWorld : MarshalByRefObject, IHelloWorld {
    public string Say() => "Hi";
}

封裝類別在重新編譯或物件銷毀時自動卸載 AppDomain 釋放記憶體。

動態程式碼偵錯:打破黑盒子

三個必要條件:

  1. 編譯產生偵錯資訊:CompilerParameters.IncludeDebugInformation = true
  2. 原始碼對應:檔案編譯自動寫入 .pdb,記憶體編譯目前無法指定原始碼位置(僅支援 CompileFromFile 偵錯)
  3. 設定中斷點:原始碼中加入 System.Diagnostics.Debugger.Break()

CSharpProvider 類別結構圖

動態程式碼偵錯示意:命中 Debugger.Break() 中斷點

已知限制與改進方向

  • 不支援多檔案編譯介面(單一腳本場景足夠)
  • 缺乏動態型別列舉介面
  • 記憶體編譯模式無法偵錯(需檔案為中介)

應用場景

  • 規則引擎:使用者自訂業務邏輯腳本
  • 報表樣板:動態編譯版面配置程式碼
  • 外掛系統:第三方擴充模組熱載入
  • 教學工具:即時編譯執行程式碼片段
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved