C#、反射、插件、程序集
我对这些东西很菜鸟。我想制作一个使用插件的 C# 程序(作为学习的一种方式)。但是,我不明白我哪里出错了:
PluginClass = a.CreateInstance("MBPlugin");
PluginClass 是 Object 类型。但它始终为空。 a 是 Assembly 类型。 该程序集肯定包含一个名为 MBPlugin 的类。那到底是怎么回事?
I'm a noob to this stuff. I want to make a C# program that uses plugins (as a way of learning). However, I don't understand where I'm going wrong here:
PluginClass = a.CreateInstance("MBPlugin");
PluginClass is of type Object. However it's always null. a is of type Assembly.
The assembly definitely contains a class named MBPlugin. So what the hell?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
该类型仅仅被称为没有命名空间的 MBPlugin 是不寻常的。您应该提供命名空间限定的名称,例如“MyCompany.Plugins.MBPlugin”。
It would be unusual for the type to be called just MBPlugin with no namespace. You should provide the namespace-qualified name, e.g. "MyCompany.Plugins.MBPlugin".
我在某些项目中使用的一种方法是:
创建一个接口
IPlugin
,它定义了您期望所有插件使用的方法。就我而言,这主要是一个 Register() 函数,它使插件有机会执行它必须执行的任何操作。然后使用
Assembly.GetTypes
枚举程序集中定义的所有类型并查找定义该接口的类(使用typeof(IPlugin).IsAssignableFrom()
)。继续并使用这些类型。另外,您可能想看看像 MEF 这样的框架,它(除其他外)完全符合您的要求。
One approach I used for some projects:
Create an interface
IPlugin
which defines methods you're expecting for all plugins. In my case, this was mostly aRegister()
function which gave the plugin the opportunity to do whatever it had to do.Then use
Assembly.GetTypes
to enumerate all types defined in the assembly and look for classes that define that interface (usingtypeof(IPlugin).IsAssignableFrom()
). The go on and use these types.Also you might want to have a look at frameworks like MEF which do (amongst other things) excatly what you want.