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

5
你好
我有一个主应用程序,它将在./plugin目录中拥有一些插件。
每个插件都是一个.NET dll文件,应该具有命名空间"Plugin"和一个实现了主应用程序中定义的IPlugin接口的"MainClass"类。
我的问题是,我不知道如何在主应用程序和每个插件之间共享相同的接口,而不需要使用using引用?

主应用程序类的一部分:

        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个回答

8

您说得对,要使用接口(或类、结构等),必须引用该程序集。如果您不希望插件引用主应用程序(这是有道理的),为什么不添加一个新的程序集来实现这个目的呢?可以将其命名为“框架”或“工具”。

例如:

Framework Assembly
 - IPlugin

PluginOne Assembly (references Framework)
 - PluginOne : IPlugin

Main App Exe (references PluginOne & Framework assemblies)

但是我如何在没有“using”语句的情况下引用框架或util dll? - alex
5
你为什么要这样做?!使用语句是语言规范的一部分,它可以消除类型的歧义,通过完整的命名空间来限定它。这就好比让你写没有大括号{}的C#代码一样荒谬! - ColinE
1
如前所述,您不必避免使用此using语句。它是语言的一部分。 - L-Four
是的,我知道,但我不能使用它,因为主应用程序的目录以及插件的目录和名称不固定。这意味着有时应用程序在“C:\”中,而插件在“C:\ plugins”中,有时主应用程序在“C:\ application \”,插件在“C:\ foo \ bar \ plugins”。 - alex
4
USING和文件位置无关,它与程序集引用有关。 - The Evil Greebo
2
@TheEvilGreebo 不好也不建设性。没有人会超越自己的能力。我们又有什么资格说他的能力是什么呢? - richard

3

IPlugin接口定义在一个单独的程序集中。

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


3

您需要一个类库程序集,其中只包含主应用程序和插件都构建的接口


3

关于这一点:

每个插件都是一个.NET dll文件,应该具有命名空间“Plugin”和类“MainClass”。

除非你是编写插件的人,否则你不能强制执行插件的命名空间或类名。

如果你发布接口(从其他程序集中分离),我实现了你的接口,那么我的命名空间可以是“Plugin”,类名可以是“MainClass”,也可以是“TheEvilGreebo”,类名可以是“IsGod”,只要我的“TheEvilGreebo.IsGod”类正确地实现了你的IPlugin接口,那么从你作为接口设计者的角度来看,这就足够了。


3
为什么?你不能强制执行它,也不应该强制执行它。 - L-Four
3
如果你这样做,你的文档就会有误。除了涉及接口的部分外,你不能控制我的代码风格。接口是类/程序集之间的契约 - 当使用你编写的内容时,我必须遵守的唯一规则就是接口。请记住这一点。 - The Evil Greebo
1
是的,这就是为什么你要将IPlugin放在它自己的程序集中,你的主应用程序和插件都需要引用它。 - The Evil Greebo
这就导致了我的问题。因此,一切都在不断地移动,从应用程序到任何插件/依赖项都没有相对路径。我不能在我的VS项目中创建一个引用,因为一旦我的插件文件夹深入系统,我的应用程序就会崩溃,说找不到“util.dll”。 - alex
我认为你需要告诉我们你想要做什么,而不是给我们一个技术解决方案并说它不起作用。因为我仍然不明白你想要实现什么,除了可能是你正在错误的方向上前进。 - L-Four
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接