Wpf在运行时加载dll

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Wpf在运行时加载dll相关的知识,希望对你有一定的参考价值。

我在WPF中创建了应用程序,每个客户端的应用程序的一部分是不同的

在我将应用程序部署到新客户端时,我必须创建新类或修改旧类,因为每个客户端都有不同的商务逻辑。

对于2客户端没有问题,但是它们越来越多。我有想法为我的应用程序创建插件。例如:我创建一个应用程序(核心),并仅将自定义DLL(插件)复制到磁盘上的特定文件夹

这是我的问题,这是一个好主意?考虑到一个客户端可能只有很少的插件,我不知道它是否足够有效。

我的样品:

    interface IST
{
    string Name { get; set; }
    string WorkRequest(string connection);
    void Start();
}

public partial class MainWindow : Window
{
    public MainWindow()
    {
        var plcConnectionString = "";
        string[] allPlugins = Directory.GetFiles(@"D:app_plugins", "*.dll", SearchOption.AllDirectories);

        foreach (var item in allPlugins)
        {
            Assembly myassembly = Assembly.LoadFrom(item);
            Type type = myassembly.GetType("appPlugins.ST");

            object instance = Activator.CreateInstance(type);
            MethodInfo[] methods = type.GetMethods();
            object res = methods[0].Invoke(instance, new object[] { plcConnectionString }); // WorkRequest
        }
    }
}

所有插件实现接口IST我可以以某种方式使用它而不是使用object

我用过它:http://www.codingvision.net/miscellaneous/c-load-dll-at-runtime

答案

使用反射来调用方法只有没有其他选择。

object instance = Activator.CreateInstance(type);
MethodInfo[] methods = type.GetMethods();
object res = methods[0].Invoke(instance, new object[] { plcConnectionString });

例如,methods[0]在这里是什么?

如果IST是核心库中的已知类型,并且插件dll中的类实现IST,请执行强制转换:

IST instance = (IST)Activator.CreateInstance(type);
instance.Start();

现在方法调用变得类型安全

以上是关于Wpf在运行时加载dll的主要内容,如果未能解决你的问题,请参考以下文章

无法在 WPF 项目中加载 DLL

开机出现加载DLL文件错误!文件名为wpf5kwe.dll 请大虾帮我!我会加高分的!

如何在运行时将图像加载到 WPF?

分析加载动态 DLL 的 .NET 应用程序

在运行时加载 C++ DLL

wpfのpack协议