2012-03-31 46 views
1

我有一個包含一些方法(顯示,隱藏和驗證)的DLL。以下是hide(Panel paneldynamic, String id, List<EventActions> eventList)方法之一的示例。所有方法都包含相同的參數。動態調用DLL中的方法

現在我已經在我的主窗體上引用了我的DLL,如何在運行時動態調用其中一種方法?

回答

10

您需要使用反射。首先,加載組件(注意,這個假設已經導入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創建的類型實例。

3

插入你的方法作爲代表進入字典

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); 
1

您可以通過反射獲取類型並調用方法是這樣的:

type.InvokeMember("hide", BindingFlags.InvokeMethod | BindingFlags.Static | 
BindingFlags.Public, null, null, new object[] { paneldynamic, id, eventList });