SoapBox.Core(SBC)框架是一个强大的工具,用于构建可扩展的应用程序。本文将介绍如何将SBC作为DLL集合使用,并通过一个简单的示例来展示其工作原理。
SoapBox.Core框架简介
SoapBox框架的演示项目是一个弹球游戏,它展示了框架提供的一些功能,但也缺少了许多应用程序所必需的功能,例如工具栏。作者发现弹球示例对自己并不十分有用,因此开始编写代码,以自己的简单示例来探索SBC的不同部分是如何工作的。
SoapBox.Core框架的问题
SoapBox框架是一系列项目,位于解决方案文件夹中,SoapBox.Core.Host作为可执行文件输出。因此,使用SoapBox需要将整个SoapBox项目集包含在本地解决方案中,并将SBC Host设置为启动项目。这种方法存在一些问题:
- 包含这些额外的项目会使解决方案变得混乱(并且可能会增加编译时间)。
- 当SoapBox有更新时,在所有项目中更新SoapBox项目会变得混乱。
- Visual Studio的Express版本不支持解决方案文件夹(它们还不支持混合语言,因此不能在Visual Basic项目中使用SoapBox C#源代码)。
设置SoapBox.Core.Host
首先,将项目类型从WinExe更改为Library。其次,将App.xaml.cs重命名为App.cs并删除App.xaml。
可能还需要手动从SoapBox.Core.Host.csproj中删除以下行:
<StartupObject>SoapBox.Core.Host.App</StartupObject>
现在,可以构建SoapBox解决方案,然后将想要使用的DLL复制到自己的项目库中。
创建启动项目(Example.Host)
这个项目输出启动应用程序的可执行文件。它基本上只是提供对SBC DLL的引用,然后设置并运行框架。然后框架完成其余的工作。以下是逐步操作:
- 启动编辑器(作者使用Visual Studio C# Express 2010)。
- 创建一个名为Example.Host的新项目。
- 在Windows资源管理器(而不是Visual Studio)中,在解决方案文件夹中创建一个名为Lib的文件夹,并将所有SoapBox、NLog和AvalonDock DLL放入其中。
- 添加对Lib文件夹中所有DLL的引用。需要对所有这些设置Visual Studio的“复制本地”属性为true,即使Example.Host没有明确需要其中一些,这样它们就会被复制到输出文件夹中。
- 删除App.xaml、MainWindow.xaml及其相关的.cs文件。
- 添加Program.cs,其中包含创建新SoapBox.Core.Host.App()对象的Main。
- 向app对象添加目录,以便SBC知道在哪里查找它们。
- 在app对象上调用Run()。
- 更改构建位置为..\bin\Debug和..\bin\Release。
此时,如果运行项目,应该得到一个简单的工作台(比截图大,但其他方面相同)。
创建示例“功能”项目(Example.HelloWorld)
对于应用程序的每个主要“功能”,都需要一个单独的项目。对于更松散耦合的解决方案,所有功能都会引用一个公共项目,例如SoapBox示例中出现的“Contracts”项目。为了简单起见(并且因为只有一个功能),所有的合同都在HelloWorld中(参见源代码中的CompositionPoints和ExtensionPoints文件)。
可能还想将其中一个功能(甚至上面的“主机”项目)设置为主外壳,以提供“主”工具栏、关于框等。
示例应用程序演示了以下内容:
- 设置应用程序图标,通过将其作为嵌入资源读取。
- SBC启动命令(关闭命令类似)。示例中的启动命令用于在应用程序启动时显示食谱文档和说明垫。
- SBC Pad(弹球演示使用Pad)。
- SBC文档。SBC文档和Pad XAML基于ResourceDictionaries,带有DataTemplate,在Visual Studio设计器中不可编辑。这个示例演示了引用UserControl,以便Visual Studio设计器可以编辑布局。对于像这个简单示例这样的简单示例,这不是一个很大的优势,但如果布局更复杂,那就太好了。
- 带有通过IExecutableCommand链接以执行某些操作(显示MessageBox)的ToolBarButton的SBC ToolBar。
- 包含几个不同项目的SBC状态栏。
- 向菜单添加项目(例如关于项目)。
创建项目的基本步骤
- 向解决方案中添加一个名为Example.HelloWorld的新WPF项目。作者发现这比使用库项目然后添加所有WPF引用更容易。
- 删除App.xaml、MainWindow.xaml及其相关的.cs文件。
- 在项目属性中,将项目类型更改为类库。
- 添加对System.ComponentModel.Composition的引用。
- 添加对Soapbox.Core.Contracts的引用。
- 更改构建位置为..\bin\Debug。
- 开始通过使用Export和Import添加SBC项目。
感兴趣的要点
要下载SoapBox Core及其相关项目,请访问。有关常见问题解答和一些快速示例,请访问。
作者尝试了很长时间,试图弄清楚如何将SBC DLL合并到一个文件中。传统的ILMerge方法不适用于WPF。作者尝试的其他几种方法都没有奏效,并给出了各种错误,作者认为这意味着MEF找不到正确的程序集,或者同一个程序集被加载到不同的上下文中。