SharpDevelop Addin(插件树)使用方法-让SharpDevelop的插件树运行在自己的程序中

SharpDevelop Addin( 插件树 ) 使用方法

在经历了 N 多次的迷茫和郁闷后,今天终于明白了 Addin 这个东东怎么使用。下面为大家总结一下我研究的过程,希望大家看过我的文档后,研究 Addin 这个的东西不再这么痛苦拉。而且可以更快的了解插件树是怎么运行的.好了,废话不多说了,下面言归正传。

Addin 作为 SharpDevelop 的核心组件,它提供了一种插件树的机制来调用插件组成整个应用程序。我将把 Addin 的核心代码从 SharpDevelop 中分离出来,然后作为单独的工程。

** 全部的过程大概分这么两个部分: ** ** **

** 一、 ** ** 从 SharpDevelop ** ** 中分离出 Addin ** ** 的代码。 **

** 二、 ** ** 新建一个工程作为调用插件树的主程序。 **

** 三、 ** ** 新建一个插件以供程序调用。 **

第一部分 分离出插件树的核心代码

那么首先来讲讲怎么从 SharpDevelop 中导出 Core 工程到 2003

1. 我们要导出代码首先就必须得到它的源码,源码可以在 SharpDevelop 的官方网站 http://www.icsharpcode.com/OpenSource/SD/Download/ 中下载。

2. 在下载完程序之后你可以在 src\Main\Core 目录下找到 Core.prjx 这个文件(此文件是 SharpDevelop 的工程文件),使用 SharpDevelop 打开此文件,这时候整个 Core 项目就加载到 SharpDevelop ( Core 为整个 SharpDevelop 的核心工程,其中包括了插件树、服务和属性)。由于 SharpDevelop 目前调试还没有 .net2003 方便,所以我们把程序导出为 .Net2003 的格式可以通过 SharpDevelop 的 “文件-》输出工程——》选择你要输出的文件夹”来导出整个项目。

3. 在输出成功后用 .Net2003 加载刚才输出的解决方案然后编译,这样就可以在输出目录下的 bin\debug 目录下找到 ICSharpCode.Core.dll 这个文件了(此文件为整个插件树的核心组件,在后面的插件树应用中全部都是引用的该组件)。

4. 拷贝 CoreKey.key 这个文件到当前项目的目录下。

在经过上述三个步骤之后,整个 Addin 的代码就从 SharpDevelop 代码中分离出来了,是不是很简单啊 ^_^ 。

第二部分 建造一个新工程来利用插件树的机制加载插件

刚才第一部分我们讲解了如何分离出插件树的核心代码,此部分我将讲解怎么在应用程序中利用插件树的机制来加载插件。

1. 首先新建一个 Windows 应用程序 AddinMain 。

2. 在刚才新建的项目中删除 Form1 然后添加一个类 AddinsMain 。

3. 引用 ICSharpCode.Core.dll 组件(要得到此组件请看第一部分)。

4. 当上述三个步骤完成后就开始编码工作了,把下面的代码 Copy 到 AddinsMain 类中。

/********************************************************************

*********************************************************************/

using System;

using System.IO;

using System.Diagnostics;

using System.Reflection;

using System.Drawing;

using System.Collections;

using System.Windows.Forms;

using System.Resources;

using System.Xml;

using System.Threading;

using System.Runtime.Remoting;

using System.Security.Policy;

// 引用 Core 的命名空间

using ICSharpCode.Core.Properties;

using ICSharpCode.Core.AddIns.Codons;

using ICSharpCode.Core.AddIns;

using ICSharpCode.Core.Services;

namespace AddinMain

{

///

1<summary>
2
3/// AddinsMain  的摘要说明。 
4
5/// </summary>

public class AddinsMain

{

public AddinsMain()

{

//

// TODO: 在此处添加构造函数逻辑

//

}

///

1<summary>
2
3///  整个程序的入口点 
4
5/// </summary>

[STAThread()]

public static void Main(string[] args)

{

// 查找 ADDIN 的主目录 默认情况下目录为当前目录的 ../Addin/

bool ignoreDefaultPath = false;

string [] addInDirs = AddInSettingsHandler.GetAddInDirectories(out ignoreDefaultPath);

AddInTreeSingleton.SetAddInDirectories(addInDirs, ignoreDefaultPath);

ArrayList commands = null;

try

{

// 启动默认的系统服务

ServiceManager.Services.AddService(new Resource());

// 启动后台服务

ServiceManager.Services.InitializeServicesSubsystem("/Workspace/Services");

// 在程序开始运行时首先加载的插件

commands = AddInTreeSingleton.AddInTree.GetTreeNode("/Workspace/Autostart").BuildChildItems(null);

for (int i = 0; i < commands.Count; ++i)

{

((ICommand)commands[i]).Run();

}

}

catch (XmlException e)

{

MessageBox.Show(" 不能加载 XML :" + Environment.NewLine + e.Message);

return;

}

catch (Exception e)

{

MessageBox.Show(" 加载出错 :" + Environment.NewLine + e.ToString());

return;

}

}

}

}

下面为大家解释一下这段代码的意思

bool ignoreDefaultPath = false;

string [] addInDirs = AddInSettingsHandler.GetAddInDirectories(out ignoreDefaultPath);

AddInTreeSingleton.SetAddInDirectories(addInDirs, ignoreDefaultPath);

此段代码的意思是查找插件树配置文件的路径,它首先去调用 AddInSettingsHandler.GetAddInDirectories () 方法( AddInSettingsHandler 类在后面介绍 ) 查找 App.Config 中的 AddInDirectories 这一项,如果在配置文件中不存在这一项的话就返回空值。

当调用 AddInTreeSingleton.SetAddInDirectories(addInDirs, ignoreDefaultPath) 方法时如果 addInDirs 为空的话那么插件树配置文件的默认路径为 ../Addin/ 。

ServiceManager.Services.AddService(new Resource());

在找到插件树配置文件路径后首先要启动一个默认的资源服务 Resource ( 该服务为系统的默认服务,必须启动,否则程序将无法运行)。

ServiceManager.Services.InitializeServicesSubsystem("/Workspace/Services");

在启动完程序的默认服务后就开始启动自定义服务了。所有默认服务都是在配置文件的 /Workspace/Services 扩展点中。

commands = AddInTreeSingleton.AddInTree.GetTreeNode("/Workspace/Autostart").BuildChildItems(null);

for (int i = 0; i < commands.Count; ++i)

{

((ICommand)commands[i]).Run();

}

这段代码就是程序启动时加载前台插件了, /Workspace/Autostart 是系统自动运行命令的扩展点路径,定义在这个路径下的插件会在系统启动的时候自动运行。

5. 经过上述的步骤后插件就可以被加载了,不过这个时候程序还不能编译,应为我们的 Resource 类和 AddInSettingsHandler 类都没有添加。

下面我们首先添加 AddInSettingsHandler 类,该类为插件树控制类。

代码如下:

/******************************************************************

********************************************************************/

using System;

using System.Configuration;

using System.Collections;

using System.Xml;

namespace AddinMain

{

///

1<summary>
2
3/// AddInSettingsHandler  的摘要说明。 
4
5/// </summary>

public class AddInSettingsHandler : System.Configuration.IConfigurationSectionHandler

{

public AddInSettingsHandler()

{

}

public object Create(object parent, object configContext, System.Xml.XmlNode section)

{

ArrayList addInDirectories = new ArrayList();

XmlNode attr = section.Attributes.GetNamedItem("ignoreDefaultPath");

if (attr != null)

{

try

{

addInDirectories.Add(Convert.ToBoolean(attr.Value));

}

catch (InvalidCastException)

{

addInDirectories.Add(false);

&

Published At
Categories with Web编程
Tagged with
comments powered by Disqus