C# Wpf在运行时加载dll

C# Wpf在运行时加载dll,c#,wpf,dll,.net-assembly,C#,Wpf,Dll,.net Assembly,我已经在WPF中创建了应用程序,应用程序的一部分对于每个客户端都是不同的 在将应用程序部署到新客户机时,我必须创建新类或修改旧类,因为每个客户机都有不同的业务逻辑 对于2来说,客户机没有问题,但客户机越来越多。 我想为我的应用程序创建插件。 例如: 我创建一个应用程序(核心),并只将自定义dll(插件)复制到磁盘上的特定文件夹中 这是我的问题,这是个好主意?考虑到一个客户端可能很少有插件,我不知道它是否足够有效 我的样本: interface IST { string Name

我已经在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 instance = Activator.CreateInstance(type);
MethodInfo[] methods = type.GetMethods();
object res = methods[0].Invoke(instance, new object[] { plcConnectionString });
例如,这里的
方法[0]
是什么

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

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

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

您可能想使用MEF:也就是说,为什么不将
实例
强制转换为IST呢
var instance=Activator.CreateInstance(类型)作为列表
;我更改代码:
IST instance=(IST)Activator.CreateInstance(type);var result=instance.WorkRequest(plcConnectionString)它的工作完全符合我的要求。WorkRequest在接口上有参数我更正了错误此解决方案将是有效的?@18666,它假设,是的。这是一次性操作。当然,如果appPlugins.ST
在构造函数中不执行繁重的操作。我讨论了关于访问方法的部分问题。请看一看类似的问题:,