动态调用DLL中的方法

本文关键字:方法 DLL 调用 动态 | 更新日期: 2023-09-27 18:29:33

我有一个DLL,其中包含一些方法(显示、隐藏和验证)。这里是方法之一CCD_ 1的示例。所有方法都包含相同的参数。

现在我已经在主窗体上引用了我的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 });