如何在Visual Studio中组织模块化(C#/ MEF)应用程序以允许调试?

时间:2016-05-10 06:46:49

标签: c# visual-studio mef

我正在使用C#和MEF开发模块化应用程序。应用程序应该由

组成
  • 一个主应用程序,它是实际的可执行文件,提供核心功能,公开许多接口(扩展点)并使用MEF来引入适合这些的插件程序集
  • 一组插件,提供适合接口的类,可供主应用程序使用

主应用程序可以单独运行,也可以使用一个或多个导入的插件运行。这应该是基于模块化MEF的应用程序的相当标准的体系结构。 初步测试表明,这似乎通常有效。如果我将主应用程序以及一个或多个插件程序集部署到文件夹中,一切正常。

但是,我正在努力解决如何为此组织Visual Studio解决方案。我最初的方法是主应用程序以及每个插件都是解决方案中的单独项目。主要应用程序是一个exe项目,而插件是dll项目。插件项目依赖于主项目,因为它们正在实现接口并使用主应用程序中定义的类(我本可以创建一个通用的lib项目来实现这一点,但它似乎没有增加任何好处)。

这样,我可以启动并调试主应用程序(没有插件)。

但是如何组织解决方案以便我可以使用一个,多个或所有插件调试主应用程序? 当前的方法将每个插件构建到自己的文件夹中(通常很好)并将主应用程序复制到每个插件中(这是不太理想的)。我可以配置一个单独的插件项目来启动其输出文件夹中的主应用程序,但我不知道如何为多个插件执行此操作,或者如果不应将主应用程序复制到每个插件输出文件夹。

任何提示或最佳做法都将受到高度赞赏。我正在使用Visual Studio 2015 - 如果这有任何区别。

1 个答案:

答案 0 :(得分:0)

  

插件项目取决于主项目,因为它们是   实现接口并使用main中定义的类   应用程序(我本可以创建一个通用的lib项目,   但它似乎没有增加任何好处。)

它有好处,这里有几个:

  • 如果您有多个项目都使用相同的类/函数,那么它们就是有意义的,它们位于一个单独的共同项目中。甚至可能是针对接口的另一个单独项目。它使得更容易掌握事物,看到一个有主应用程序的解决方案,一些具有共同功能的dll,一些插件
  • 假设您曾经必须添加另一个主应用程序,那么也可以使用常见的dll,而不必引用第一个主应用程序
  • 您最终将主应用程序复制x次到其他项目的输出目录,因为它们依赖于它
  • 看起来有点奇怪(最后对我来说)其他项目将 exe 项目作为依赖项而不是dll项目。就像我真的很奇怪一个插件依赖于主要的应用程序它反过来加载。虽然可能只是我 - 但我认为这也是你必须在第一个问题中提出其余问题的原因之一的地方。
  

但是如何组织解决方案以便我可以调试main   使用一个,多个或所有插件的应用程序?

典型地,您在启动时告诉您的主应用程序要加载哪个插件。有不同的方法:读取包含插件名称的文件,扫描插件的已知目录,组合。所有支持或相对容易使用MEF实现。例如,对于我们拥有的一个大型C#应用程序,所有插件都被复制到bin \ Plugins之类的东西中。当应用程序启动时,它会在bin \ Plugins中查找dll,根据包含正则表达式的文本文件过滤列表,然后从过滤后的列表中加载插件。将应用程序发送给客户时,他们可以获得全部或仅一些插件。在开发时,我们使用文本文件来减少应用程序加载时间。