C#,反射,插件,程序集

C#,反射,插件,程序集,c#,plugins,assemblies,C#,Plugins,Assemblies,我对这件事一无所知。我想制作一个使用插件的C#程序(作为一种学习方式)。然而,我不明白我在这里哪里出了问题: PluginClass = a.CreateInstance("MBPlugin"); PluginClass属于Object类型。但是它总是空的。类型为汇编。 程序集肯定包含一个名为MBPlugin的类。那到底是怎么回事?如果只调用没有名称空间的MBPlugin类型,那将是不寻常的。您应该提供名称空间限定名称,例如“MyCompany.Plugins.MBPlugin”。我在一些项目

我对这件事一无所知。我想制作一个使用插件的C#程序(作为一种学习方式)。然而,我不明白我在这里哪里出了问题:

PluginClass = a.CreateInstance("MBPlugin");
PluginClass属于Object类型。但是它总是空的。类型为汇编。
程序集肯定包含一个名为MBPlugin的类。那到底是怎么回事?

如果只调用没有名称空间的MBPlugin类型,那将是不寻常的。您应该提供名称空间限定名称,例如“MyCompany.Plugins.MBPlugin”。

我在一些项目中使用的一种方法:

创建一个接口
IPlugin
,它定义了所有插件所需的方法。在我的例子中,这主要是一个
Register()
函数,它为插件提供了做任何事情的机会

然后使用
Assembly.GetTypes
枚举程序集中定义的所有类型,并查找定义该接口的类(使用
typeof(IPlugin).IsAssignableFrom()
)。继续使用这些类型


此外,您可能还想了解一些框架,例如哪些框架可以(除其他外)实现您想要的功能。

您最好从MEF开始:好的,好的。所以显然,我知道这里的名称空间,因为我制作了“测试插件”。。。但是您通常如何在程序集中获得名称空间?@Motig:这完全取决于插件的配置方式。你怎么知道这个班的名字?这将是奇怪的要求插件命名为一个特定的名称。。。我的意思是,您可以查看Assembly.GetTypes()的结果,找到一个名称正确的类,但这会很奇怪。@Motig:根据“plugin”一词的使用范围,有各种不同的插件机制可用。有些使用额外的配置文件,有些基于文件夹检测程序集,并通过属性解决插件依赖关系。我同意Martin关于使用插件接口的回答,插件接口可以被检测到。