当前位置: 首页 > news >正文

[VSX.001]深入VS SDK

本文为阅读Inside the Visual Studio SDK笔记。

 

扩展VS的方法很多,最常见的有三种:Automation,VSPackage extensions,Managed Extensibility Framework(MEF) extensions.

 

Automation:主要用来做一些可以被自动化的重复性任务,以宏(macros), 插件(add-in),向导(wizard).

 

VSPackage extension:VS有很多组件都是VSPackage,例如:调试器(debugger), 工具栏(predefined toolbar).VSPackage是扩展VS强有力的方法,它可以访问并且扩展VS的很多组件,例如:shell和项目系统(project system).

 

MEF(Managed Extensibility Framework) :MEF是一个扩展机制,可以在不创建VSPackage的情况下自定义和扩展编辑器(editor).[不解]

VS Extensibility Model (VS可扩展模型)

 

VS可扩展模型是由不同的库(library)组成的,以便让新的扩展访问VS的各个组件.

 

最基础的模型是VS API是一系列的接口(interface),微软的员工就是用它们开发出了VS.对于非托管代码,你可以用一个基于模板的VSL(VS Library) 来写扩展.

 

如果你选用托管代码,你可以用直接用VS interop assemblies(互操作程序集??),或者选用MPF(Managed Package Framework, 不同于上面的MEF哦) 提供的类,这些类封装了很多VS API的接口.

 

你如果需要扩展编辑器,你可以用编辑器程序集或者MEF程序集.[不解]

 

:

  • Developing VSPackages By Using the Visual Studio Library

  • VSPackages and the Managed Package Framework

 

VS服务(Services)

一个服务提供一系列接口.VS提供一系列服务可以被任何包括扩展在内的任何组件使用.例如:服务可以让工具窗口动态显示/隐藏,访问帮助,状态栏,UI事件.VS2010的编辑器提供的服务可以被编辑器的扩展导入.

 

:

  • Service Essentials

  • Registering Services

  • List of Available Services

  • Editor Services

VS可扩展组件

常被扩展的组件有:

Shell命令(Commands)

菜单栏和工具栏

工具窗口(Tool Windows)

文档窗口(Document Windows)

编辑器(Editor)

语言服务(Language Service)

项目(Project)

模板(Template)

 

命令(Command)

命令是一些任务,例如:打印文档,重绘视图,创建新文件.

你可以创建并把这些命令注册到VS.你可以决定这些命令出现在VS的什么地方,例如:菜单或者工具栏.一般来讲,自定义的命令出现在"工具(Tools)"菜单,会显示工具窗口的命令一般出现在"View"的子菜单"Other Windows”里面.

必须给命令创建一个事件响应(Event handler).The event handler determines when the command is visible or enabled, lets you modify its text, and guarantees that the command responds appropriately when it is activated. In most instances, the IDE handles commands by using the IOleCommandTarget interface. Commands in Visual Studio are handled starting with the innermost command context, based on the local selection, and proceeding to the outermost context, based on the global selection. Commands added to the main menu are immediately available for scripting.

 

:

How VSPackages Add User Interface Elements to the IDE.

 

菜单和工具栏

这段都是废话,说菜单可以调用命令,有主菜单,子菜单,和上下文菜单(右键菜单).

:

Common Menu Tasks

这段又是废话,讲什么是工具栏的.

:

  • Menu and Toolbar Essentials

  • Default Command, Group, and Toolbar Placement

工具窗口(Tool Windows)

工具窗口的例子:Toolbox, Solution Explorer,Properties窗口,Web Browser.

工具窗口提供了多种多样的可与用户交互控件.比如属性(Properties)窗口让用户可以设置对象的属性,并且可以用于不同的情景.输出(Output)窗口也类似.等等...

看下图列出了几个VS的工具窗口:

Screen shot

不同的窗口可以停靠(Dock)在一个面板(Pane)上.

上图的主文档窗口显示了几个编辑器窗口停靠在一个面板上.

 

 

当你创建并且正确注册了你的工具(或编辑器)窗口扩展,他们自动拥有了和原有工具窗口一样的停靠等特性.

 

:

  • Tool Windows.

  • Tool Window Essentials

  • How to: Create a Tool Window

文档窗口(Document Windows)

文档窗口的概念是MDI(Multiple-document interface)的窗口,例如:文档编辑器,设计器(Designer)等...

文档窗口一般会与文件的类型关联起来,例如:HTML,C++文件等..

:

  • Document Windows

  • Document Windows Overview

  • Document Window Implementation

编辑器

编辑器是VS2010的新组件.编辑器本身是一个VSPackage,你可以通过MEF来扩展它,大部分情况下不用创建新的VSPackage.当你想使用比如菜单命令或者快捷键的时候,你可以创建一个带MEF的VSPackage.

在你想有一个自定义的设计器之类组件时,你可以创建一个编辑器.

:

Editors

语言服务(Language Service)

需要支持新的编程语言时,需要创建一个语言服务. 语言服务提供诸如:语法高亮,智能提示等编辑器特性.

语言服务的核心是一个解释器(parser)和一个扫描器(scanner)或者称词法分析器(lexer).Scanner把源文件分成叫做tokens的元素,parser确定这些token的关系.

你可以创建托管和非托管的语言服务.

:

  • Implementing a Language Service By Using the Managed Package Framework.

  • Walkthrough: Creating a Language Service (Managed Package Framework)

  • Developing a Language Service

项目(Projects)

Project用来组织和build源代码和其他资源.可以通过用VSPackage提供Project 类型,Project子类型,自定义工具来扩展VS的项目系统.

Solution是一个或多个Projects.Solution存储在.sln文件里.

:

  • Project Types

  • Project Subtypes

  • Solutions

  • Walkthrough: Part 1 - Creating a Basic Project System

项目和Item模板

模板包含了项目的结构和基本文件.

:

Adding Project and Project Item Templates.

集成(Integrated)和独立(Isolated)应用程序.

一个集成到原有的VS里面,一个包含了独立的一个VS空壳.

:

  • Visual Studio Shell, Integrated Mode and Isolated Mode

  • Visual Studio Shell (Isolated Mode)

转载于:https://www.cnblogs.com/young40/archive/2010/11/03/1867921.html

相关文章:

  • 提供第三种代码生成方式——通过自定义BuildProvider为ASP.NET提供代码生成
  • 一个很简单的Win32汇编程序
  • Silverlight如何跨域访问没有策略文件的服务
  • Linux内核代码学习笔记(2.6.21.7 ARM) -- 内核启动函数start_kernel
  • 将DataTable转换成类的方法
  • NOKIA C5-00怎么连接电脑??
  • 2010 支付宝DevDiv移动开发者大会[上海]
  • Java王者归来 6月Tiobe编程语言排行榜公布
  • 关于 在JQuery dialog里的服务器控件 事件失效问题
  • jquery的uploadify在 firefox 上传出问题,怎么解决啊
  • 从客户端(TexContent=rty内容)中检测到有潜在危险的Request.Form 值 解决方案
  • Linux--打包压缩 tar,gzip,bzip2
  • DataRow的RowState属性
  • HTML a 标签的 target 属性说明
  • 冬季谨防胃病复发 放松精神吃温热食物
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【前端学习】-粗谈选择器
  • Angular6错误 Service: No provider for Renderer2
  • export和import的用法总结
  • Java,console输出实时的转向GUI textbox
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • mockjs让前端开发独立于后端
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • rabbitmq延迟消息示例
  • React系列之 Redux 架构模式
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 简单实现一个textarea自适应高度
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 排序算法之--选择排序
  • 使用Gradle第一次构建Java程序
  • 双管齐下,VMware的容器新战略
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • AI算硅基生命吗,为什么?
  • Prometheus VS InfluxDB
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (1)常见O(n^2)排序算法解析
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (接口封装)
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (实战篇)如何缓存数据
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)Linux下编译安装log4cxx
  • (转)负载均衡,回话保持,cookie
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core 控制台应用程序读取配置文件app.config
  • .net core 依赖注入的基本用发
  • .net 使用ajax控件后如何调用前端脚本