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

Emit 基本操作:動態建立組件、模組、型別與方法骨架

     編輯:關於.NET

Emit 是反射的孿生兄弟,支援執行期產生 IL 代碼。本系列三篇完成簡易 Mock 介面動態實作,本文為第一篇:建立完整動態組件架構。

動態實作介面需求

業務場景:成對 Before/After 方法依規則分類,工廠 AdviceProviderFactory.GetProvider 動態建立 IAssessmentAopAdviceProvider 實例。單元測試需 Mock 此介面行為,參考 Moq 語法:mock.Setup(t=>t.Before(...)).Returns(...)。

動態建立組件層級

  1. AssemblyBuilder:AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)。Run 僅執行,RunAndSave 可持久化,ReflectionOnly 僅反射。
  2. ModuleBuilder:assemblyBuilder.DefineDynamicModule("MvcAdviceProvider"),三個多載支援檔案輸出與符號資訊。
  3. TypeBuilder:moduleBuilder.DefineType(name, TypeAttributes.Public, typeof(object), new[]{typeof(IAssessmentAopAdviceProvider)}) 定義公共類別實作介面。
  4. MethodBuilder:typeBuilder.DefineMethod("Before", MethodAttributes.Public, typeof(object), new[]{typeof(object)}) 定義方法簽章。

工廠類雛形

靜態建構子初始化 AssemblyBuilder/ModuleBuilder;CreateInstance 檢查快取、建立 TypeBuilder、定義 Before/After 方法、CreateType()、Activator.CreateInstance 回傳介面實例。

Mock 類雛形

Mock<T> 持有 Obj (介面實例) 與 SetupContext (記錄 Setup/Returns 設定)。三個擴充方法:Setup 解析 Lambda 取 MethodInfo、Returns 設定回傳值、ToMethodInfo 從運算式樹提取方法。

下一步

下篇將注入 IL 方法體完成工廠與 Mock 實際功能,並探討 Emit 與 Mono.Cecil 替代方案。

作者:玄魂
出處:https://www.cnblogs.com/xuanhun/

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved