2

对不起,如果我不够清楚,我很难写这个问题。

我下载了一个开源软件。我想扩展功能,所以我想创建模块来封装这些模块的功能,这些模块将是 .dll 文件。我希望一个完全独立于另一个:如果我在配置文件中将一个键设置为 true 并且如果文件夹中存在 DLL,则应该加载插件。

问题是:如何动态调用插件(仅应用插件调用)?

如果我直接引用插件类,我将不得不引用插件 dll,但我希望能够在没有插件的情况下运行核心软件。是否有任何设计模式或其他机制允许我仅在应用插件时加载和使用 DLL,并且仍然可以在没有插件的情况下运行核心软件?

4

4 回答 4

3

有多种方法可以实现这一点,我将在这里描述一个简单的解决方案。

制作每个插件必须实现的通用接口,以便与核心应用程序集成。这是一个例子:

// Interface which plugins must implement
public interface IPlugin
{
  void DoSomething(int Data);
}

// Custom plugin which implements interface
public class Plugin : IPlugin
{
  public void DoSomething(int Data)
  {
    // Do something
  }
}

要实际从 dll 加载插件,您需要使用反射,例如:

// Load plugin dll and create plugin instance
var a = Assembly.LoadFrom("MyCustomPlugin.dll");
var t = a.GetType("MyCustomPlugin.Plugin");
var p = (IPlugin)Activator.CreateInstance(t);

// Use plugin instance later
p.DoSomething(123);

您可以为插件程序集和类使用某种命名约定,以便轻松加载它们。

于 2013-02-17T21:53:03.407 回答
2

您可以使用MEF

托管可扩展性框架 (MEF) 是 .NET 的组合层,可提高大型应用程序的灵活性、可维护性和可测试性。MEF 可用于第三方插件扩展,或者它可以为常规应用程序带来松散耦合的插件式架构的好处。

是编程指南。

于 2013-02-17T21:40:26.600 回答
2

.NET 术语中的插件或 DLL 称为程序集。查看 Assemply.Load 方法,以及msdn 中的本指南

于 2013-02-17T21:41:09.103 回答
1

System.Reflection命名空间提供了许多工具来帮助您处理这种情况。

你可以

  • 检查程序集(DLL 文件)以检查其中的对象,
  • 找到您正在寻找的类型(特定类、实现特定接口的类等)
  • create new instances of those classes, and
  • invoke methods and access properties of those classes.

Typically you would write a class in the extension which does some work, create a method (e.g. DoWork()), and then invoke that method dynamically.

The MEF mentioned in this question does exactly this, just with a lot more framework.

于 2013-02-18T00:37:44.927 回答