WinForm中实现插件式开发
插件式开发的好处很多,这里只说说借助ICSharpCode来实现插件式开发的过程。
首先下载ICSharpCode.Core.dll和ICSharpCode.Core.WinForms.dll,然后配置一个Addin文件,取名为SubMenu.Addin,内容如下:
1
<AddIn name = "ShtxSmsSum"
2
author = "JasonChou"
3
url = "http://www.xxxx.cn"
4
description = "外部插件">
5![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
<Manifest>
7![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
</Manifest>
9![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10
<!--Runtime节指定了插件功能模块所在的库文件MainForm.dll的具体路径-->
11
<Runtime>
12
<Import assembly="ShtxSmsSum.PlugIn.dll"/>
13
</Runtime>
14![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
15
<!--Path节中指定了扩展点路径/JasonChou/myMenus(该路径是指在程序运行时自动运行该插件),然后在Path内指定了它的ID、Command类名-->
16
<Path name = "/JasonChou/myMenus">
17
<MenuItem id = "External_Menu"
18
type = "Menu"
19
label = "其它工具"
20
insertbefore = "Manager">
21
<MenuItem id ="SmsAccountTool"
22
label="短信统计工具"
23
class="ShtxSmsSum.PlugIn.SmsAccountTool"
24
/>
25
<MenuItem id ="SearchHistoryCommand"
26
label="历史价格查询"
27
class="ShtxSmsSum.PlugIn.SearchHistoryCommand"
28
/>
29
<MenuItem id ="SearchSendSumCommand"
30
label="查询发送数量"
31
class="ShtxSmsSum.PlugIn.SearchSendSumCommand"
32
/>
33
</MenuItem>
34
</Path>
35![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
36
37
</AddIn>
38![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
32
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
33
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
34
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
35
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
36
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
37
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
38
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
如果以上代码有不明白的,先不管它,继续看下面之后会明白的,在主程序的Program.cs文件main方法中加入如下代码:
1
Assembly asm = Assembly.GetExecutingAssembly();
2
FileUtility.ApplicationRootPath = Path.GetDirectoryName(asm.Location);
3
CoreStartup coreStartup = new CoreStartup("ShtxSmsSum");
4
coreStartup.PropertiesName = "ShtxSmsSum";
5
coreStartup.StartCoreServices();
6
// 在指定文件夹中搜寻插件的配置文件
7
coreStartup.AddAddInsFromDirectory(Path.Combine(FileUtility.ApplicationRootPath, "PlusIn"));
8
// AddinManager 插件的属性:保存用户禁用的插件信息
9
coreStartup.ConfigureExternalAddIns(Path.Combine(PropertyService.ConfigDirectory, "AddIns.xml"));
10
// AddinManager 插件的属性:保存用户安装的插件信息
11
coreStartup.ConfigureUserAddIns(Path.Combine(PropertyService.ConfigDirectory, "AddIns"),
12
Path.Combine(PropertyService.ConfigDirectory, "AddIns"));
13
coreStartup.RunInitialization();
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
这段的作用是在程序开始运行时就加载Addin文件里面的内容。然后在主窗体的构造方法中加入下面一句:
MenuService.AddItemsToMenu(menuStrip1.Items, this, "/JasonChou/myMenus");
这样就把Addin里面配置的菜单加入了主窗体的menuStrip1这个菜单控件中。
下面就是开发插件了,新建一个类库项目,这里取名叫ShtxSmsSum.PlugIn,下面有三个窗体Form1、SearchHistory、SearchSendSum,把相应功能做好,进入最后一步:
在此ShtxSmsSum.PlugIn项目中新建一个类,我取名叫CommandMenu.cs,里面代码如下:
1
namespace ShtxSmsSum.PlugIn
2
{
3
public class SmsAccountTool : AbstractMenuCommand
4
{
5
public override void Run()
6
{
7
Form1 st = new Form1();
8
st.Show();
9
}
10
}
11![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
public class SearchHistoryCommand : AbstractMenuCommand
13
{
14
public override void Run()
15
{
16
SearchHistory sh = SearchHistory.GetInstance();
17
sh.Show();
18
}
19
}
20![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
public class SearchSendSumCommand : AbstractMenuCommand
22
{
23
public override void Run()
24
{
25
SearchSendSum ss = SearchSendSum.GetInstance();
26
ss.Show();
27
}
28
}
29
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
继承ICSharpCode.Core中的AbstractMenuCommand类,然后重写Run方法,在Run方法中把新窗体显示出来即可。这样就完成了一个很简单的插件式开发,运行结果如下: