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

C# 如何在多个程序集上共享接口,c#,windows,forms,plugins,C#,Windows,Forms,Plugins,你好我有一个主应用程序,它将在./plugin目录中包含一些插件。 每个插件都是一个.NET dll,应该有名称空间“plugin”和一个类“MainClass”,实现主应用程序中定义的IPlugin接口。 我的问题是,我不知道如何在没有参考的情况下,在主应用程序和每个插件之间共享相同的界面 主应用程序类的一部分: object oo = Assembly.LoadFile(path).CreateInstance("Plugin.MainClass"); IPl

你好
我有一个主应用程序,它将在./plugin目录中包含一些插件。
每个插件都是一个.NET dll,应该有名称空间“plugin”和一个类“MainClass”,实现主应用程序中定义的IPlugin接口。
我的问题是,我不知道如何在没有
参考的情况下,在主应用程序和每个插件之间共享相同的界面

主应用程序类的一部分:

        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";
       }
    }
}

正确的做法是,要使用接口(或类、结构等),必须引用该程序集。如果您不希望插件引用主应用程序(这很有意义),为什么不为此添加一个新的程序集呢?称之为“框架”或“util”

例如


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


另外,如果您还没有了解MEF,那么您应该完全了解它:

您想要一个类库程序集,它只包含主应用程序和插件所基于的接口。

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

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

如果您发布了接口(如其他人所建议的,从一个单独的程序集发布),并且我实现了您的接口,那么无论我的命名空间是带有类MainClass的Plugin,还是命名空间是“theevigreebo”,类名是“IsGod”,都没有关系


只要我的“theevilegreebo.IsGod”类正确地实现了你的IPlugin,从你作为界面设计师的角度来看,这就是最重要的。

但是我如何在不使用
语句的情况下引用框架或util dll?你到底为什么要这样做?!它是语言规范的一部分,using语句消除类型的歧义,通过其完整的名称空间限定它。这就像要求写C#而不带大括号{}!如前所述,您不必避免使用此语句。它是语言的一部分。“使用”与文件位置无关——它与程序集引用有关。@Thevilgreebo既不酷也不具建设性。没有人对自己的能力反应过度。是的,但在我的文档中,我会写下,每个插件都必须使用完全相同的名称和名称空间来实现类,但是为什么呢?你不能强制执行它,你不应该强制执行它。那么你的文档就错了。除了涉及接口的部分之外,我的代码的外观不是由您来决定的。接口是类/程序集之间的契约-这是我在处理您编写的内容时必须遵守的唯一事项。我的应用程序如何才能知道将要转换到
IPlugin
的类的名称?是的,这就是为什么您将IPlugin放在自己的程序集中,哪些是你的主应用,哪些插件需要引用。
Framework Assembly
 - IPlugin

PluginOne Assembly (references Framework)
 - PluginOne : IPlugin

Main App Exe (references PluginOne & Framework assemblies)