日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

巧用Mono.Cecil反射加载类型和方法信息

發布時間:2025/6/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 巧用Mono.Cecil反射加载类型和方法信息 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??? 最近在做服務的細粒度治理,統一管理所有服務的方法、參數、返回值信息。方便后續的各個模塊之間的對接和協作。

?? 目前系統中所有的服務,管理到接口契約粒度,即服務接口聲明和服務接口實現。要做服務的細粒度治理:

?? 首先需要將服務的各個方法信息全部反射出來,然后再統一管理。

?? 大致的思路是這樣的:

???? 1. 下載所有最新的服務包(dll文件集合)

???? 2. 獲取所有的服務定義信息

???? 3. 反射加載出每個服務詳細的方法信息(方法名、參數、返回值等)

一、下載所有最新的服務包

??? 系統中幾百個服務,幾十個服務組,每個服務都對應一個服務包(dll文件集合),通過FTP將所有最新的服務包下載到本地,釋放出來

每個服務包一個文件夾

二、獲取所有的服務定義信息

?? 這個也很簡單,從主數據庫中獲取最新的服務定義信息即可,放到本地內存的一個集合中

三、反射加載出每個服務詳細的方法信息(方法名、參數、返回值等)

???循環遍歷每個服務,Reflect每個接口信息,那么問題來了?

? 很多服務之間是有依賴的,所以有服務組的概念,反射加載時,必須指定:

AppDomain.CurrentDomain.AppendPrivatePath(servicePath);

然后,反射加載各個接口和接口實現

1 Assembly asm = Assembly.Load(metadata.Invoke.UserDefineAssemble); 2 Type type = asm.GetType(metadata.Invoke.UserDefineClass, true, true);

這樣做,通過發現Assembly加載不起來,因為反射加載時,很多依賴的dll找不到,或者不是最新版本(服務有多版本設計)。

具體反射的dll加載順序,請大家參考MSDN:

https://docs.microsoft.com/en-us/dotnet/framework/deployment/how-the-runtime-locates-assemblies

如何解決這個問題?其實很簡單的一個需要,解析Dll中的 Method Table.

此時,想到了ILSpy,Reflector,這些組件實現了Dll的反射加載,找找看看相關的SDK。

找著找著發現了Mono.Cecil.

http://www.mono-project.com/docs/tools+libraries/libraries/Mono.Cecil/

Cecil is a library written by Jb Evain to generate and inspect programs and libraries in the ECMA CIL format.

With Cecil, you can load existing managed assemblies, browse all the contained types, modify them on the fly and save back to the disk the modified assembly.

直接Nuget引用。

關鍵的幾個dll:

using Mono.Cecil;

同時,為了方便加載dll和處理服務組的dll,將所有服務包的dll遞歸放到一個文件夾中,同名Dll以最新修改時間為準。
上述文件準備工作就緒后,可以編碼了:

1 using HSF.Service.Govermance.SPI; 2 using Mono.Cecil; 3 using System; 4 using System.Collections.Generic; 5 using System.IO; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 10 namespace HSF.Service.Govermance.Service 11 { 12 /// <summary> 13 /// 反射加載工具類 14 /// </summary> 15 class ReflectionUtils 16 { 17 public static List<HSFServiceMethod> GetMethods(HSFServiceMetadataEntity metaData, string path) 18 { 19 var result = new List<HSFServiceMethod>(); 20 var file = Path.Combine(path, metaData.ServiceImplAssembly.Replace(" ", "")); 21 var assembly = Mono.Cecil.AssemblyDefinition.ReadAssembly(file); 22 TypeDefinition type = assembly.MainModule.GetType(metaData.ServiceImplClass); 23 var methods = type.Methods; 24 foreach (var method in methods) 25 { 26 var hsfMethod = new HSFServiceMethod(); 27 hsfMethod.ID = Guid.NewGuid().ToString(); 28 hsfMethod.ServiceID = metaData.ServiceID; 29 hsfMethod.MethodName = method.Name; 30 hsfMethod.ReturnType = method.ReturnType.FullName; 31 hsfMethod.Parameters = new List<HSFServiceParameter>(); 32 var methodName = method.Name; 33 if (method.Parameters != null && method.Parameters.Count > 0) 34 { 35 foreach (var parameter in method.Parameters) 36 { 37 HSFServiceParameter para = new HSFServiceParameter() 38 { 39 ID = Guid.NewGuid().ToString(), 40 MethodID = hsfMethod.ID, 41 ServiceID = metaData.ServiceID, 42 ParameterName = parameter.Name, 43 ParameterOrder = parameter.Sequence, 44 ParameterType = parameter.ParameterType.FullName, 45 }; 46 47 hsfMethod.Parameters.Add(para); 48 } 49 } 50 51 result.Add(hsfMethod); 52 } 53 54 return result; 55 } 56 } 57 }

所有的服務的方法、參數、返回值信息全部搞定。

周國慶

2017/9/29

?

轉載于:https://www.cnblogs.com/tianqing/p/7610560.html

總結

以上是生活随笔為你收集整理的巧用Mono.Cecil反射加载类型和方法信息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。