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