如何在多个程序集上共享接口

时间:2011-06-15 14:25:53

标签: c# windows forms plugins

您好我有一个主应用程序,它将在./plugin目录中有一些插件 每个插件都是一个.NET dll,应该有名称空间“Plugin”和一个实现主应用程序中定义的IPlugin接口的类“MainClass”。
我遇到的问题是我不知道如何在主应用程序和每个插件之间共享相同的界面而不用 using引用?

主app类的一部分:

        object oo = Assembly.LoadFile(path).CreateInstance("Plugin.MainClass");
        IPlugin pp = (IPlugin)oo; //Fails if I define the interface in the main app and the plugins

和第一个插件的一部分:

namespace Plugin
{
    public class MainClass : IPlugin //I cannot reference the interface in the main app?
    {
       public string getName()
       {
          return "Plugin 1";
       }
    }
}

4 个答案:

答案 0 :(得分:8)

您使用接口(或类,结构等等)是正确的,您必须引用该程序集。如果您不希望您的插件引用主应用程序(这是有道理的)为什么不为此目的添加新的程序集?称之为'框架'或'util'。

E.G

Framework Assembly
 - IPlugin

PluginOne Assembly (references Framework)
 - PluginOne : IPlugin

Main App Exe (references PluginOne & Framework assemblies)

答案 1 :(得分:3)

只需在单独的程序集中定义IPlugin接口即可。

另外,如果你还没有,你应该完全看看MEF:http://mef.codeplex.com/

答案 2 :(得分:3)

您需要一个只包含两者主要应用程序和插件的接口的类库程序集。

答案 3 :(得分:3)

关于这一点:

  

每个插件都是.NET dll,应该有名称空间“Plugin”和类“MainClass”

您不能强制执行插件的命名空间或类名,除非您是编写它们的人。

如果您发布接口(来自其他人建议的单独程序集),并且我实现了您的接口,那么我的Namespace是插件与MainClass类或命名空间是“TheEvilGreebo”并且类名是“上帝会给”。

只要我的“TheEvilGreebo.IsGod”类正确地实现您的IPlugin,那么从您作为界面设计师的角度来看,这一切都很重要。