我有一個包含一些方法(顯示,隱藏和驗證)的DLL。以下是hide(Panel paneldynamic, String id, List<EventActions> eventList)
方法之一的示例。所有方法都包含相同的參數。動態調用DLL中的方法
現在我已經在我的主窗體上引用了我的DLL,如何在運行時動態調用其中一種方法?
我有一個包含一些方法(顯示,隱藏和驗證)的DLL。以下是hide(Panel paneldynamic, String id, List<EventActions> eventList)
方法之一的示例。所有方法都包含相同的參數。動態調用DLL中的方法
現在我已經在我的主窗體上引用了我的DLL,如何在運行時動態調用其中一種方法?
您需要使用反射。首先,加載組件(注意,這個假設已經導入System.Reflection
):
Assembly a = Assembly.LoadFile(pathToTheDll);
獲得通過完全限定名稱包含方法類型:
Type t = a.GetType("Some.Class");
現在,獲得方法:
MethodInfo m = t.GetMethod("hide"); // For example
然後,所有你需要做的就是調用它:
m.Invoke(null, new object[] { /* parameters go here */ });
Invoke
的第一個參數是實例。如果您的班級是static
,請使用null
,否則,您需要提供使用Assembly.CreateInstance
創建的類型實例。
插入你的方法作爲代表進入字典
public enum MethodType
{
None,
Show,
Hide,
Validate
}
var methods = new Dictionary<MethodType, Action<Panel, String, List<EventActions>>();
methods.Add(MethodType.Show, show);
methods.Add(MethodType.Hide, hide);
methods.Add(MethodType.Validate, validate);
然後你就可以調用其中的一個與
MethodType methodToInvoke = MethodType.Hide;
methods[methodToInvoke](paneldynamic, id, eventList);
如果您打算動態加載的DLL,這是另一個故事。您將需要至少三個程序集(三個項目):一個主程序集(exe),一個合同程序集(dll)和一個插件程序集(dll)。主插件和插件都必須引用合約程序集。該合同組件包括一個接口
public interface IPlugIn
{
void Show(Panel paneldynamic, String id, List<EventActions> eventList);
void Hide(Panel paneldynamic, String id, List<EventActions> eventList);
void Validate(Panel paneldynamic, String id, List<EventActions> eventList);
}
插件集包含實現接口
public class PlugIn : IPlugIn
{
// TODO: implement IPlugIn
}
在主組件中的類,你可以加載插件,這樣
IPlugIn LoadPlugInFromFile(string fileName)
{
Assembly asm = Assembly.LoadFrom(fileName);
Type type = asm.GetType("PlugIn");
IPlugIn plugIn = (IPlugIn)Activator.CreateInstance(type);
return plugIn;
}
這樣的調用
IPlugIn plugIn = LoadPlugInFromFile("C:\PlugIns\MyPlugIn.dll");
plugIn.Show(paneldynamic, id, eventList);
您可以通過反射獲取類型並調用方法是這樣的:
type.InvokeMember("hide", BindingFlags.InvokeMethod | BindingFlags.Static |
BindingFlags.Public, null, null, new object[] { paneldynamic, id, eventList });