我有一个包含一些方法的DLL(显示,隐藏和验证)。以下是其中一种方法hide(Panel paneldynamic, String id, List<EventActions> eventList)
的示例。所有方法都包含相同的参数。
现在我在主窗体上引用了我的DLL,如何在运行时动态调用其中一个方法?
答案 0 :(得分:13)
你需要使用反射。首先,加载程序集(请注意,这假设您已导入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
创建的类型的实例。
答案 1 :(得分: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);
答案 2 :(得分:1)
您可以通过Reflection获取类型并调用这样的方法:
type.InvokeMember("hide", BindingFlags.InvokeMethod | BindingFlags.Static |
BindingFlags.Public, null, null, new object[] { paneldynamic, id, eventList });