2012-03-31 67 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 });