制作SharpDevelop插件

2024-01-07 13:48
文章标签 制作 插件 sharpdevelop

本文主要是介绍制作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 


这篇关于制作SharpDevelop插件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/580113

相关文章

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

maven中的maven-antrun-plugin插件示例详解

《maven中的maven-antrun-plugin插件示例详解》maven-antrun-plugin是Maven生态中一个强大的工具,尤其适合需要复用Ant脚本或实现复杂构建逻辑的场景... 目录1. 核心功能2. 典型使用场景3. 配置示例4. 关键配置项5. 优缺点分析6. 最佳实践7. 常见问题

MyBatis分页插件PageHelper深度解析与实践指南

《MyBatis分页插件PageHelper深度解析与实践指南》在数据库操作中,分页查询是最常见的需求之一,传统的分页方式通常有两种内存分页和SQL分页,MyBatis作为优秀的ORM框架,本身并未提... 目录1. 为什么需要分页插件?2. PageHelper简介3. PageHelper集成与配置3.

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑

Idea插件MybatisX失效的问题解决

《Idea插件MybatisX失效的问题解决》:本文主要介绍Idea插件MybatisX失效的问题解决,详细的介绍了4种问题的解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录一、重启idea或者卸载重装MyBATis插件(无需多言)二、检查.XML文件与.Java(该文件后缀Idea可能会隐藏

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

IDEA常用插件之代码扫描SonarLint详解

《IDEA常用插件之代码扫描SonarLint详解》SonarLint是一款用于代码扫描的插件,可以帮助查找隐藏的bug,下载并安装插件后,右键点击项目并选择“Analyze”、“Analyzewit... 目录SonajavascriptrLint 查找隐藏的bug下载安装插件扫描代码查看结果总结Sona

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

Maven(插件配置和生命周期的绑定)

1.这篇文章很好,介绍的maven插件的。 2.maven的source插件为例,可以把源代码打成包。 Goals Overview就可以查看该插件下面所有的目标。 这里我们要使用的是source:jar-no-fork。 3.查看source插件的example,然后配置到riil-collect.xml中。  <build>   <plugins>    <pl