制作SharpDevelop插件

来源:http://blog.sina.com.cn/s/blog_7b60d05f0101uzbj.html

  


这段时间在研究SD编译器内部的东西,做一个向导插件,下面总结一下制作的过程。

向导插件会用到这些技术:
1.以插件的方式挂到SD上。
2.与SD中当前项目交互(添加文件,修改项目结构文件(处理有命名空间的XML文件)),模板文件的储存与读取(程序集内嵌资源)
3.向导的导航功能(胡哥的导航控件)。

下面就一个个技术记录下来:

1.以插件的方式把程序挂到SD上。
    SD是以插件的方式运行起来的,我本来做的时候是挂到工具栏的第一项的,怎么挂到工具栏呢?使用SD5.0版本,然后 SharpDevelop向导插件制作过程总结

,项目结构: SharpDevelop向导插件制作过程总结,这个Demo.addin文件要和程序集一起打包到SD的插件扩展文件夹上的,那么这个Demo.addin是干嘛的呢?主要是用来声明的,声明该插件在SD的插件树的什么位置,id是什么,位置方位在哪,还有一个最重要的就是和程序集的连接了,有了这个连接,声明和后台代码才能结合起来,连接点就是Class节点,这个节点指向程序集中的启动类。那么插件就能运作。
下面看一下工具栏的插件的声明:
SharpDevelop向导插件制作过程总结

<Manifest></Manifest>标签里面是配置插件附属哪个SD版本的,还有就是身份标识,然后Runtime标签是配置实用哪个程序集,然后重点在于Path,name属性设置插到插件树的什么位置,这个具体位置能通过SD中的 SharpDevelop向导插件制作过程总结(Addin Scout)插件查看,,用一下就知道了,Class属性就是指定使用哪个启动类了。

然后我们要开始写启动类:
1.引入SD的两个程序集,到SD的Bin下面找:ICSharpCode.SharpDevelop.dll和ICSharpCode.Core.dll。
2.新建一个类,然后继承 AbstractMenuCommand类。
3.在Run里面写逻辑,,例如新建窗口并打开,之后你懂得。

SharpDevelop向导插件制作过程总结

,鉴于会扩展到工具栏,下面给出工具栏的Addin文件:
SharpDevelop向导插件制作过程总结
OK~~~~第一步完成!


2.与SD中当前项目交互(添加文件,修改项目结构文件(处理有命名空间的XML文件))。

这一步就是新建窗口之后,画好内容以后,怎么去和SD交互的部分了,我下了一个和SD操作的经理类,全部贴上来:
namespace CG.Models
{
/// <summary>
/// SD经理,提供一些对SD进行操作的接口,方便其他部件对SD进行交互
/// </summary>
public class SDManager
{
/// <summary>
/// 寻找当前视图页是否存在该视图(例如StartPage)
/// </summary>
/// <param name="ContansViewType">视图的类型</param>
/// <returns>如果存在视图实例,返回True,否则返回False</returns>
public bool ContansViewContent(Type ContansViewType)
{
foreach(IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection)
{
if(content.GetType()==ContansViewType)
{
return true;
}
}
return false;
}
/// <summary>
/// 在视图栏中新建并且打开视图
/// </summary>
/// <param name="content">要显示的视图对象</param>
public void ShowViewContent(IViewContent content)
{
Type type=content.GetType();
if(!ContansViewContent(type))
{
WorkbenchSingleton.Workbench.ShowView(content);
}
else
{
content.WorkbenchWindow.SelectWindow();
}
}
/// <summary>
/// 在视图栏中移除对应类型的视图
/// </summary>
/// <param name="ViewContentType">视图的类型</param>
public void CloseViewContent(Type ViewContentType)
{
foreach (IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection)
            {
if (content.GetType()==ViewContentType)
                {
                    content.WorkbenchWindow.CloseWindow(true);
                }
            }

}
/// <summary>
/// 在视图栏中寻找和传入类型相匹配的视图,并且返回视图
/// </summary>
/// <param name="ViewType">视图类型</param>
/// <returns>视图对象</returns>
public IViewContent GetViewContent(Type ViewType)
{
//存在视图,返回
foreach(IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection)
{
if(content.GetType()==ViewType)
{
return content;
}
}
return null;
}
/// <summary>
/// 获取最近打开的项目
/// </summary>
/// <returns>返回最近打开的项目String列表</returns>
public IList<String> GetRecentProjects()
{
  return FileService.RecentOpen.RecentProject;
}
/// <summary>
/// 获取最近打开的文件
/// </summary>
/// <returns>返回最近打开的文件String列表</returns>
public IList<String> GetRecentFiles()
{
return FileService.RecentOpen.RecentFile;
}
/// <summary>
/// 通过解决方案或者项目的Url地址进行加载
/// </summary>
/// <param name="Url"></param>
public void LoadSolutionOrProject(string Url)
{
ProjectService.LoadSolutionOrProject(Url);
}
/// <summary>
/// 新建解决方案
/// </summary>
public void CreatNewSolution()
{
new CreateNewSolution().Run();
}
/// <summary>
/// 打开解决方案
/// </summary>
public void OpenSolution()
{
}
/// <summary>
/// 获取当前项目节点
/// </summary>
/// <returns></returns>
public ProjectNode GetCurrentProject()
{
return ProjectBrowserPad.Instance.CurrentProject;
}
/// <summary>
/// 让项目Pad显示到最前
/// </summary>
public void LetProjectPadToFront()
{
ProjectBrowserPad.Instance.BringToFront();
}
/// <summary>
/// 返回当前项目的文件节点,里面提供对文件栏的操作(让文件处于打开状态等,AddNewFile等)
/// </summary>
/// <returns></returns>
public DirectoryNode GetCurrentDirectoryNode()
{
return ProjectBrowserPad.Instance.ProjectBrowserControl.SelectedDirectoryNode;
}
/// <summary>
/// 更新文件点
/// </summary>
/// <param name="node"></param>
public void UpdateDirectoryNode(DirectoryNode node)
{
node.Project.Save();
            node.RecreateSubNodes();

}

        /// <summary>
        /// 打开默认的类添加框
        /// </summary>
        public void ShowClassCreateDialog()
        {
            using (NewFileDialog dialog = new NewFileDialog(null))
            {
                dialog.ShowDialog(WorkbenchSingleton.MainWin32Window);
            }
        }
}
}

要不通过SD内部机制添加文件到项目中去,就需要修改项目的内部配置文件,例如 SharpDevelop向导插件制作过程总结
打开以后发现有这些东西:
SharpDevelop向导插件制作过程总结
那么,我试了一下添加多一个Compile节点,Include里面是文件名,然后再工程中添加相应文件名的文件,然后打开工程,果然出来了,所以,手动化的东西需要程序化,,那么就要用到Xml文件操作技术,以前我只会用Linq to XML,但是发现读取不了,为什么呢,是命名空间作怪,上网查了一下,有命名空间的XML文件要以一种特殊的方式处理,下面给出程序化的以下步骤:
1.获取各个参数(项目名字,项目的目录地址,项目配置文件地址)
SharpDevelop向导插件制作过程总结
2.修改项目配置文件
一:先加载XML文件: SharpDevelop向导插件制作过程总结
二:新建一个XmlNamespaceManager类,获取节点 SharpDevelop向导插件制作过程总结
三:遍历节点,遇到有Compile节点的就在其后添加一个新的节点:
SharpDevelop向导插件制作过程总结
四:后续工作:包存文件,刷新SD项目
SharpDevelop向导插件制作过程总结

3.这样还不够,还要在项目位置添加实体类,并且填充模板代码
SharpDevelop向导插件制作过程总结
分别添加两个模板文件,里面是类的模板内容,记住要把他们的生成方式都变成嵌入的资源,然后利用反射获取这个程序集的这个txt文件的内容
SharpDevelop向导插件制作过程总结

获取到字符串,然后修改字符串里面的东西,再变成字节数组,然后:
SharpDevelop向导插件制作过程总结

SharpDevelop向导插件制作过程总结
,,OK了,新的文件模板文件已经到了项目里面,,大概就这样完成了。

3.还有向导的导航功能参看另一篇文章,地址: http://blog.sina.com.cn/s/blog_7b60d05f0101uyst.html 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值