我已经构建了一个插件系统,我可以在其中动态地将类加载到我的应用程序中(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
。
答案 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()
并将结果填入某个静态字段,稍后可以使用该字段创建主模块中定义的类的实例。