ASP.NET 網站專案中,App_Code 目錄下的程式碼會動態編譯成獨立組件,組件名稱為 __code 或 app_code。本文示範如何透過 Assembly.Load 載入該組件,進而取得型別、建立實例、呼叫方法。
Assembly asm = Assembly.Load("__code"); 或 Assembly.Load("app_code");Type tp = asm.GetType("Tools"); 取得型別(類別名稱不含命名空間)。Activator.CreateInstance(tp) 建立實例(非 static 方法需實例)。tp.GetMethod("Reg") 取得方法資訊。mi.Invoke(obj, null) 執行方法並取得回傳值。Default.aspx.csusing System;
using System.Reflection;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// 載入 App_Code 動態組件
Assembly asm = Assembly.Load("__code");
// 或 Assembly asm = Assembly.Load("app_code");
Type tp = asm.GetType("Tools");
if (tp != null)
{
object obj = Activator.CreateInstance(tp); // 建立實例
MethodInfo mi = tp.GetMethod("Reg"); // 取得方法
object ret = mi.Invoke(obj, null); // 執行方法
string result = ret.ToString(); // 取得結果
Response.Write("呼叫結果:" + result);
}
}
}
using System;
public class Tools
{
public string Reg()
{
return "aa";
}
}
__code(預設)或 app_code,視專案類型而定,Web Application 專案不適用(App_Code 不存在)。GetType 參數為類別完整名稱(含命名空間),若類別無命名空間則直接寫類別名。ReflectionPermission,中信任環境可能受限。MethodInfo 或使用 Delegate.CreateDelegate 提升速度。