本文主要是介绍制作SharpDevelop插件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
来源:http://blog.sina.com.cn/s/blog_7b60d05f0101uzbj.html
这段时间在研究SD编译器内部的东西,做一个向导插件,下面总结一下制作的过程。
SD是以插件的方式运行起来的,我本来做的时候是挂到工具栏的第一项的,怎么挂到工具栏呢?使用SD5.0版本,然后
<Manifest></Manifest>标签里面是配置插件附属哪个SD版本的,还有就是身份标识,然后Runtime标签是配置实用哪个程序集,然后重点在于Path,name属性设置插到插件树的什么位置,这个具体位置能通过SD中的 (Addin Scout)插件查看,,用一下就知道了,Class属性就是指定使用哪个启动类了。
OK~~~~第一步完成!
{ { content.WorkbenchWindow.CloseWindow(true); } }
return FileService.RecentOpen.RecentProject; node.RecreateSubNodes();
/// <summary> /// 打开默认的类添加框 /// </summary> public void ShowClassCreateDialog() { using (NewFileDialog dialog = new NewFileDialog(null)) { dialog.ShowDialog(WorkbenchSingleton.MainWin32Window); } }
那么,我试了一下添加多一个Compile节点,Include里面是文件名,然后再工程中添加相应文件名的文件,然后打开工程,果然出来了,所以,手动化的东西需要程序化,,那么就要用到Xml文件操作技术,以前我只会用Linq to XML,但是发现读取不了,为什么呢,是命名空间作怪,上网查了一下,有命名空间的XML文件要以一种特殊的方式处理,下面给出程序化的以下步骤: 2.修改项目配置文件
三:遍历节点,遇到有Compile节点的就在其后添加一个新的节点:
四:后续工作:包存文件,刷新SD项目
分别添加两个模板文件,里面是类的模板内容,记住要把他们的生成方式都变成嵌入的资源,然后利用反射获取这个程序集的这个txt文件的内容
,,OK了,新的文件模板文件已经到了项目里面,,大概就这样完成了。
向导插件会用到这些技术:
1.以插件的方式挂到SD上。
2.与SD中当前项目交互(添加文件,修改项目结构文件(处理有命名空间的XML文件)),模板文件的储存与读取(程序集内嵌资源)
3.向导的导航功能(胡哥的导航控件)。
下面就一个个技术记录下来:
1.以插件的方式把程序挂到SD上。
,项目结构: ,这个Demo.addin文件要和程序集一起打包到SD的插件扩展文件夹上的,那么这个Demo.addin是干嘛的呢?主要是用来声明的,声明该插件在SD的插件树的什么位置,id是什么,位置方位在哪,还有一个最重要的就是和程序集的连接了,有了这个连接,声明和后台代码才能结合起来,连接点就是Class节点,这个节点指向程序集中的启动类。那么插件就能运作。
下面看一下工具栏的插件的声明:
然后我们要开始写启动类:
1.引入SD的两个程序集,到SD的Bin下面找:ICSharpCode.SharpDevelop.dll和ICSharpCode.Core.dll。
2.新建一个类,然后继承 AbstractMenuCommand类。
3.在Run里面写逻辑,,例如新建窗口并打开,之后你懂得。
,鉴于会扩展到工具栏,下面给出工具栏的Addin文件:
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)
}
/// <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()
{
}
/// <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();
}
}
}
要不通过SD内部机制添加文件到项目中去,就需要修改项目的内部配置文件,例如
打开以后发现有这些东西: 那么,我试了一下添加多一个Compile节点,Include里面是文件名,然后再工程中添加相应文件名的文件,然后打开工程,果然出来了,所以,手动化的东西需要程序化,,那么就要用到Xml文件操作技术,以前我只会用Linq to XML,但是发现读取不了,为什么呢,是命名空间作怪,上网查了一下,有命名空间的XML文件要以一种特殊的方式处理,下面给出程序化的以下步骤:
1.获取各个参数(项目名字,项目的目录地址,项目配置文件地址)
一:先加载XML文件:
二:新建一个XmlNamespaceManager类,获取节点 三:遍历节点,遇到有Compile节点的就在其后添加一个新的节点:
四:后续工作:包存文件,刷新SD项目
3.这样还不够,还要在项目位置添加实体类,并且填充模板代码
获取到字符串,然后修改字符串里面的东西,再变成字节数组,然后:
,,OK了,新的文件模板文件已经到了项目里面,,大概就这样完成了。
3.还有向导的导航功能参看另一篇文章,地址: http://blog.sina.com.cn/s/blog_7b60d05f0101uyst.html
这篇关于制作SharpDevelop插件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!