zoukankan      html  css  js  c++  java
  • Visual Studio中开发

    如何在Visual Studio中开发自己的代码生成器插件

     

       Visual Studio是美国微软公司开发的一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等,且所写的目标代码适用于微软支持的所有平台.可以说.NET开发人员离不开它,它可以极大的提高编写软件的效率. Visual Studio作为一个世界级开发工具,当然支持通过插件方式对其功能进行扩展,开发人员可以定制自己的插件来进一步提升Visual Studio的功能.

    1 什么是Add In?

      所谓的add-in就是一些被Visual Studio加载到内存中运行的,能给用户提供特定功能的DLL动态链接库. 对于一般的开发情景来说,最常见的add-in用法就是可以通过.NET语言访问 DTE2 对象. DTE2是Visual Studio Automation Model的顶层对象,它具有一组接口和对象可以与 Visual Studio进行交互.DTE2可以做以下这些事情:

    • 访问和调用Visual Studio内置的函数和对象
    • 执行编译
    • 遍历解决方案中的项目
    • 在Visual Studio IDE中定制UI
    • 扩展Visual Studio功能...

    2 创建VS Add In项目

      用Visual Studio 2012创建名为MyVisualStudioAddin的项目(根据向导进行设置,这里不赘述),界面如下:

    3 核心 Connect 类

      插件入口就是Connect 类,先看一下Connect的类图:

    • Connect 实现外接程序对象的构造函数。请将您的初始化代码置于此方法内。
    • OnConnection 实现 IDTExtensibility2 接口的 OnConnection 方法。接收正在加载外接程序的通知。
    • OnDisconnection 实现 IDTExtensibility2 接口的 OnDisconnection 方法。接收正在卸载外接程序的通知。
    • OnAddInsUpdate 实现 IDTExtensibility2 接口的 OnAddInsUpdate 方法。当外接程序集合已发生更改时接收通知。
    • OnStartupComplete 实现 IDTExtensibility2 接口的 OnStartupComplete 方法。接收宿主应用程序已完成加载的通知。
    • OnBeginShutdown 实现 IDTExtensibility2 接口的 OnBeginShutdown 方法。接收正在卸载宿主应用程序的通知。
    • QueryStatus 实现 IDTCommandTarget 接口的 QueryStatus 方法。此方法在更新该命令的可用性时调用。
    • Exec 实现 IDTCommandTarget 接口的 Exec 方法。此方法在调用该命令时调用。
    • _applicationObject 是DTE2实例,是宿主应用程序的根对象。
    • _addInInstance是当前插件实例,表示此外接程序的对象。

       首先定义一些内部的对象,主要是自定义的命令,如下所示:

    复制代码
     1     /// <summary>用于实现外接程序的对象。</summary>
     2     /// <seealso class='IDTExtensibility2' />
     3     public class Connect : IDTExtensibility2, IDTCommandTarget
     4     {
     5         #region 命令定义  除了FindInSolutionExplorer外,此处的命令不是根据功能来命令的,而是根据命令所出现的位置来命令的
     6         private readonly string MY_COMMAND_FindInSolutionExplorer = "FindInSolutionExplorer";
     7         private readonly string MY_COMMAND_Project = "cmdInProject";//在项目上
     8         private readonly string MY_COMMAND_Solution = "cmdInSolution";//在解决方案上
     9         private readonly string MY_COMMAND_MenuBar = "cmdInMenuBar";//在菜单栏上
    10         private readonly string MY_COMMAND_CodeWindow = "cmdInCodeWindow";//代码窗口
    11         private readonly string MY_COMMAND_Files = "cmdInFiles";
    12         #endregion
    13 
    14         private Command findCommand = null;
    15         private CommandBarButton findCommandBarButtonButton = null;
    16         private AddInLogger logger = null;
    17 
    18         private DTE2 _applicationObject;
    19         private EnvDTE.AddIn _addInInstance;
    20      ......
    21 }
    复制代码

      初始化插件UI的代码:

     View Code
     View Code
     View Code
     View Exec Code

       获取当前IDE激活项目的路径:

    复制代码
     1        /// <summary>
     2         /// Gets the Active project FullPath
     3         /// </summary>
     4         /// <returns></returns>
     5         public string GetActiveProjectFullPath()
     6         {
     7            // Returns the name of the currently selected project in the solution.
     8             Project proj = getActiveProject();
     9             if (proj!=null)
    10             {
    11                 string fullPath = proj.Properties.Item("FullPath").Value.ToString();
    12                 return fullPath;
    13                // return proj.FullName;
    14             }
    15             return "";
    16             
    17         }
    18         /// <summary>
    19         /// Gets the Active project
    20         /// </summary>
    21         /// <returns></returns>
    22         public Project getActiveProject()
    23         {
    24             Array projects = (Array)_applicationObject.ActiveSolutionProjects;
    25             if (projects != null && projects.Length > 0)
    26             {
    27                 return projects.GetValue(0) as Project;
    28             }
    29             projects = (Array)_applicationObject.Solution.SolutionBuild.StartupProjects;
    30             if (projects != null && projects.Length >= 1)
    31             {
    32                 return projects.GetValue(0) as Project;
    33             }
    34             projects = (Array)_applicationObject.Solution.Projects;
    35             if (projects != null && projects.Length > 0)
    36             {
    37                 return projects.GetValue(0) as Project;
    38             }
    39             return null;
    40         }
    复制代码

      关于如何根据数据库结构生成C# Code代码,可以参加此文章.

    4 插件发布

      创建了外接程序后,必须先向 Visual Studio 注册此外接程序,然后才能在“外接程序管理器”中激活它。 使用具有 .addin 文件扩展名的 XML 文件来完成此操作。.addin 文件描述了 Visual Studio 在“外接程序管理器”中显示外接程序所需的信息。 在 Visual Studio 启动时,它会查找 .addin 文件位置,获取任何可用的 .addin 文件。 如果找到相应文件,则会读取 XML 文件并向“外接程序管理器”提供在单击外接程序进行启动时所需的信息。使用外接程序向导创建外接程序时,会自动创建一个 .addin 文件。 你也可以使用本主题中的信息手动创建 .addin 文件。我是用Visual Studio2012 所以将.addin文件和对应的dll拷贝到C:UserswangmingDocumentsVisual Studio 2012Addins文件下:

      如果发布没有错误,那么重新启动Visual Studio2012后,在项目文件上右击弹出菜单,可以看到下面的界面:

      同时在菜单栏创建了一个JackWang的命令按钮和工具菜单下还添加了一个MyVS外接程序的命令按钮,如下图:

    5 代码生成器

      代码生成器(此处用的是yuvalsol的工程,我将其整合到插件中)可以根据用户选择的数据库,选择对应的表,然后生成表结构对应的C#类:

     6 插件卸载

      如果自己定义的插件想卸载怎么办?可参见https://msdn.microsoft.com/en-us/library/ms228765.aspx.

    • 删除插件对应的.addin文件. 默认路径为..UsersusernameMy DocumentsVisual Studio 2012Addins(请根据实际情况查看具体路径)

    • 在 Visual Studio开发人员命令行中, 输入devenv /resetaddin MyVisualStudioAddin.Connect  进行卸载(MyVisualStudioAddin.Connect 是MyVisualStudioAddin.AddIn文件中的FullClassName;

    • 至此, add-in 不会出现在IDE中,卸载完成. 但是要完整去除必须手动删除插件对应的项目文件(如果你再次调试,可能会再次进行注册);

     7 总结

      通过插件机制可以方便的定制VS IDE, 一般软件公司都有自己的一套框架,其代码也有一定的封装,且各不相同,可以通过扩展VS,通过定制的代码生成工具来快速生成符合本公司所需的代码,从而从重复机械的劳动中解放出来(虽然完全自动生成的代码不可能直接能用,但是人工在此基础上进行调整,也提升了代码的编写效率,而且减少类似于拼写/标点等人为的错误点等.

      虽然我们不生产代码,是代码的搬运工,但是正确的打开方式是用代码去帮我们搬运代码!!!

    水平有限,望各位园友不吝赐教!如果觉得不错,请点击推荐和关注! 
    出处:http://www.cnblogs.com/isaboy/ 
  • 相关阅读:
    疲劳的一天
    Singleton模式与对象池的假设....
    没有杀死我的 (创伤心理学简介)
    Python深入03 对象的属性
    协议森林14 逆袭 (CIDR与NAT)
    Python深入05 装饰器
    协议森林06 瑞士军刀 (ICMP协议)
    数据可视化的秘密
    协议森林
    协议森林13 9527 (DNS协议)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5001346.html
Copyright © 2011-2022 走看看