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

发布于 2024-09-17 19:59:54 字数 223 浏览 6 评论 0原文

我对这些东西很菜鸟。我想制作一个使用插件的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

风筝在阴天搁浅。 2024-09-24 19:59:54

该类型仅仅被称为没有命名空间的 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".

身边 2024-09-24 19:59:54

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

创建一个接口 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 a Register() 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 (using typeof(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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文