【问题标题】:C#, reflection, plugins, assembliesC#、反射、插件、程序集
【发布时间】:2011-04-08 16:20:07
【问题描述】:

我对这些东西很陌生。我想制作一个使用插件的 C# 程序(作为一种学习方式)。但是,我不明白我要去哪里错了:

PluginClass = a.CreateInstance("MBPlugin");

PluginClass 是 Object 类型。但是它始终为空。 a 是 Assembly 类型。 该程序集肯定包含一个名为 MBPlugin 的类。那是什么鬼?

【问题讨论】:

标签: c# plugins assemblies


【解决方案1】:

将类型称为只是没有命名空间的 MBPlugin 是不寻常的。您应该提供命名空间限定的名称,例如"MyCompany.Plugins.MBPlugin"。

【讨论】:

  • 好的,好的。所以......显然我知道这里的命名空间,因为我制作了“测试插件”......但是你如何在程序集中正常获取命名空间?
  • @Motig:这完全取决于您的插件的配置方式。你怎么会知道班级名称?要求使用特定名称命名插件会很奇怪...我的意思是,您可以查看Assembly.GetTypes() 的结果并找到具有正确名称的类,但它会奇怪。
  • @Motig:有多种不同的插件机制可用,具体取决于您使用“插件”一词的范围。有些使用额外的配置文件,有些基于文件夹检测程序集并通过属性解决插件依赖关系。我同意 Martin 关于使用插件 interface 的回答,然后可以检测到该插件。
【解决方案2】:

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

创建一个接口IPlugin,它定义了您期望所有插件的方法。就我而言,这主要是一个 Register() 函数,它让插件有机会做它必须做的任何事情。

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

此外,您可能还想看看像 MEF 这样的框架,它们(除其他外)完全符合您的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    相关资源
    最近更新 更多