掃描註冊表中 Value 為 null 的類型 → 收集待編譯清單 → 生成唯一命名空間 Temp{GUID} → 呼叫 GenerateCode 產出原始碼 → 設定編譯參數(引用 mscorlib、System、System.Data、實體組件、框架組件)→ 呼叫 CSharpCodeProvider.CompileAssemblyFromSource(.NET 1.1/2.0 呼叫方式略異,2.0 相容 1.1 代碼)→ 檢查編譯錯誤 → 成功則反射取得各 XxxORMHelper 類型 → Activator.CreateInstance 建立實例 → 回填註冊表 → 列印建立日誌。
private int BuildHelpers(string strFileName) {
var RecordTypes = new ArrayList();
foreach (Type t in myRecordHelpers.Keys)
if (myRecordHelpers[t] == null) RecordTypes.Add(t);
if (RecordTypes.Count == 0) return 0;
string nsName = "Temp" + Guid.NewGuid().ToString("N");
string strSource = GenerateCode(nsName, strFileName, RecordTypes);
var options = new CompilerParameters {
GenerateExecutable = false,
GenerateInMemory = true
};
// 收集引用組件...
var provider = new CSharpCodeProvider();
var result = provider.CompileAssemblyFromSource(options, strSource);
if (result.Errors.Count == 0) {
var asm = result.CompiledAssembly;
myAssemblies.Add(asm);
foreach (Type rt in RecordTypes) {
Type helperType = asm.GetType(nsName + "." + rt.Name + "ORMHelper");
var helper = (RecordORMHelper)Activator.CreateInstance(helperType);
myRecordHelpers[rt] = helper;
Console.WriteLine($"FastORM為\"{rt.FullName}\"創建操作幫助對象");
}
} else {
Console.WriteLine("ORM框架動態編譯錯誤");
foreach (string line in result.Output) Console.WriteLine(line);
}
provider.Dispose();
return RecordTypes.Count;
}
編譯完成、輔助器就緒後,框架對外提供 ReadObjects、InsertObject、UpdateObject、DeleteObject 等高層 API,內部統一走「取得輔助器 → 建立命令 → 填充參數 → 執行」流程,實現高效能 ORM。