反射的基本概念: .Net Framework 中提供了反射機制,可以再加載程序運行時,動態獲取和加載程序集,並且可以獲取到程序集的信息
創建Assembly和Entity兩個程序集,在Assembly中添加Entity引用,如下圖:
namespace Entity { public class GetData { public static SIMPEntities SIMP = new SIMPEntities(); /// <summary> /// 查詢方法--返回序列化json /// </summary> /// <returns></returns> public string GetResule() { JavaScriptSerializer Serialize = new JavaScriptSerializer(); var list = SIMP.Sys_Employee .Select(a => new { id = a.EmpId, EmpName = a.EmpName, PositionName = (a.Sys_Position!=null)?a.Sys_Position.PositionName:"無" }) .ToList(); return Serialize.Serialize(list); } } }
namespace AssemblyTest { class Program { private static Program pro = new Program(); static void Main(string[] args) { pro.GetAssemblyInfo(); pro.LoadAssembly(); Console.ReadLine(); } /// <summary> /// 動態讀取DLL,執行其中的方法 /// </summary> public void LoadAssembly() { //DLL所在的絕對路徑 Assembly assembly = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "Entity.dll"); //注意寫法:程序集.類名 Type type = assembly.GetType("Entity.GetData"); //獲取類中的公共方法GetResule MethodInfo methed = type.GetMethod("GetResule"); //創建對象的實例 object instance = System.Activator.CreateInstance(type); //執行方法 new object[]為方法中的參數 object result = methed.Invoke(instance, new object[] { }); } /// <summary> /// //獲取程序集信息 /// </summary> public void GetAssemblyInfo() { Type type = typeof(Program); Assembly assembly = Assembly.GetExecutingAssembly(); Console.WriteLine("命名空間:{0}", type.Namespace); Console.WriteLine("程序集:{0}", type.Assembly); Console.WriteLine("類的名字{0}", type.Name); Console.WriteLine("類的全部名字{0}", type.FullName); Console.WriteLine("基類:{0}", type.BaseType); Console.WriteLine("----------------------------"); Console.WriteLine("程序集的名稱:{0}", assembly.GetName()); Console.WriteLine("程序集的全名:{0}", assembly.FullName); Console.WriteLine("程序集的版本:{0}", assembly.GetName().Version); Console.WriteLine("程序集的位置:{0}", assembly.Location); Console.WriteLine("程序集所在目錄:{0}", AppDomain.CurrentDomain.BaseDirectory); } } }