如何从插件中获取类实例?

时间:2016-12-29 18:32:57

标签: c# plugins

我已经构建了一个插件系统,我可以在其中动态地将类加载到我的应用程序中(IModule是一个接口,所以我知道该插件的行为正确):

 var dll = Assembly.LoadFile("path/to/a/dll");
 foreach (Type t in dll.GetExportedTypes()) {
       if (typeof(IModule).IsAssignableFrom(t)) {
          IModule mod = (IModule)Activator.CreateInstance(t);
       }
 }

所以,从我的"主要"应用程序,我可以在我的插件中获取并实例化类。我现在想要的是能够进入" main"的课程。应用程序,来自插件。

我尝试使用Type.GetType("NameOfClass"),但返回null

2 个答案:

答案 0 :(得分:0)

我认为你误解了类似插件的概念。您应该实现API库,其目的是存储公共插件接口。您将在插件中使用的那些接口,并通过一些IoC框架实例化您的类。例如,您可以使用Ninject:

public class MyPlugin : IModule
{
     public MyPlugin(MainApp.API.IMainAppInterface instance)
     {
         //do something with it.
     }
}

public class MyPluginModule: NinjectModule
{
    protected override void Load(IKernel kernel)
    {
        kernel.Bind<MyPlugin>().To<IModule>();
    }
}

在您的主应用程序中,您只需从某个文件夹加载这些模块。

答案 1 :(得分:0)

如果您需要在不改变主模块的情况下进行此操作,这肯定会变得丑陋,事实证明是这种情况。因此,以下建议是一个kludge,但我认为在这种情况下,你可以希望最好的kludge。

静态方法Assembly.GetCallingAssembly()将返回调用您当前所在方法的程序集,因此您可以做的一件事是找到主模块直接调用某个方法M的地方插件模块。手指交叉,也许有某种初始化方法可以在早期调用。

M中,调用Assembly.GetCallingAssembly()并将结果填入某个静态字段,稍后可以使用该字段创建主模块中定义的类的实例。