本文介绍C#中DTE的概念和用法。做VS插件开发,不得不了解DTE,有了DTE我们就可以与VS交互了,比如说获取当前选择的文件,比如说获取当前主窗口,比如说获取编译器等等。

  1. 操作流程
    1.1. DTE基本概念
    1.1.1. 概念
    Visual Studio 自动化对象模型中的顶级对象。 使用此对象可以实现功能。官网风衣如下:

1.2. 语法

1.2.1. 属性


1.2.2. 方法

其示例如下所示:

1.3. DTE需要引用的文件

在 EnvDTE 程序集中,DTE 对象表示 Visual Studio 集成开发环境 (IDE),并且是自动化模型层次结构中最高级别的对象。 所有的自动化应用程序必须有对此对象的引用,以获取对核心自动化模型的访问权。 Visual Studio 的情况也如此。
但是添加的 EnvDTE80 程序集提供了一个名为 DTE2 的顶级替换对象,以取代 DTE 对象。 两个对象的作用和编程方式相似,但是 DTE2 包含一些新功能,并承载了许多新建和更新的对象和集合。

因此,在创建新自动化应用程序和外接程序时,应创建对这两个对象的引用。 新 DTE2 对象提供了对新功能的访问权,而 DTE 对象提供了对核心自动化功能其余部分的访问权。 只要可能,就应使用 DTE2 下的新对象和集合,而不使用 DTE 中的对象和集合。

下面的过程显示如何获取对 DTE2 对象的引用。 (此过程也适用于 DTE 对象。)在添加对对象的引用前,必须添加对相应的程序集和类型库的引用。 有关更多信息,请参见如何:添加对自动化命名空间的引用。
要使用的编程标识符 (ProgID) 为 VisualStudio.DTE.10.0。 然后可以将返回的对象强制转换为 DTE2 接口。
DTE2 属性、方法和事件在被调用时,将返回 DTE 类型。 例如,Solution 会返回一个 Solution 对象,而不是您可能期望的 Solution2 对象。 所以,当使用成员 DTE2 或其他类型的成员时,必须显式强制转换它们的类型。 这样做有许多原因。 首先这样可以提高一致性并减少发生混淆。 对于所有 DTE2 属性,EnvDTE80.dll 程序集一致地返回相同的接口。 返回最新的接口版本造成混淆。 例如,如果将来版本的 Visual Studio 有一个 DTE3 类型,则有些接口可能返回 DTE,有些返回 DTE2,还有些返回 DTE3。 另外,它会造成 COM 互操作问题,这是因为 EnvDTE80 中的“2”接口派生自 EnvDTE 接口。 例如,Window2 派生自 Window。 如果将 DTE 属性添加到 Window2,它就会隐藏 Windows 属性,而不会与 COM 应用程序一起正常工作。
简而言之就是,需要导入EnvDTE80应用文件,用DTE2创建对象,如下所示:

1.4. 获取DTE实例
1.4.1. 获取DTE版本
DTE能实现很多核心操作功能,比如说获取当前选择的文件,比如说获取当前主窗口,比如说获取编译器等等。但DTE的使用首先需要获取当前Visual Studio的DTE版本,然后才能进行操作,正确获取DTE版本,可参照以下博客:
https://blog.csdn.net/weixin_34364135/article/details/94177038?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_aa&utm_relevant_index=1
本文讲解其中一种方式,即在变体管理工具使用到的获取DTE版本的方法:

首先是创建DTE2对象,和字符串ProgID,如下所示:

然后首先获取当前Visual Studio版本,使用了自定义函数GetRegistryValue,具体实现如下所示:其原理是读取注册表的信息,从而获取Visual Studio版本信息:

打开注册表,可看到需要获取的值,该程序好处是没有把VS版本写死在程序中,比较灵活获取VS版本信息。

然后,设置type t用于获取ProgID的类型

再用(DTE2)Activator.CreateInstance(t),即获取了当下DTE的版本了,即获取当前VS版本的DTE对象实例。

1.5. DTE相关属性应用
1.5.1. dte.SuppressUI
获取或设置一个指示用户界面 (UI) 在自动化代码执行过程中是否应该显示的值。

1.5.2. dte.Solution
获取 Solution 对象,该对象表示环境的当前实例中所有打开的项目并允许访问生成对象。即获取解决方案实例,程序中可以对解决方案进行打开、修改等操作,如下所示:一个solution中可以包含多个Peoject.


1.5.3. dte. Project
表示集成开发环境 (IDE) 中的项目。一个解决方案中可以有多个Project,因此Project对象可以对一个解决方案中的某个Project进行操作,如下:



至此DTE的概念和用法讲解完成,英勇DTE主要就是为了获得系统操作相应的权限。例如,打开一个TwinCAT组态,需要做的是,首先获取VS版本的DTE,然后创建solution对象,从而获取打开解决方案的权限,然后再获取Project,再把Project的Object赋值给相应的实例对象。

C#中DTE的概念和用法相关推荐

  1. js中闭包的概念和用法

    闭包:主要的作用是 封装变量,收敛权限.防止变量被污染.比如Jquery框架就运用了大量的闭包.为什么呢? 问个问题?框架是如何来避免你声明的变量和它自带的变量不发生的冲突的?????很明显,需要闭包 ...

  2. Python中基础数据类型(List、Tuple、Dict)的概念和用法

    在Python中会有很多的数据类型,今天小千就来介绍其中的三种,列表,元组,字典和他们的概念与用法,看完你就都明白了. 一.列表 首先List是有[]包括的,每个元素用(逗号)隔开,List中可以嵌套 ...

  3. 深入理解正则表达式环视的概念与用法

    在<深入理解正则表达式高级教程-环视>中已经对环视做了简单的介绍,但是,可能还有一些读者比较迷惑,今天特意以专题的形式,深入探讨一下正则表达式的环视的概念与用法. 深入理解正则表达式环视的 ...

  4. python类装饰器详解-Python装饰器基础概念与用法详解

    本文实例讲述了Python装饰器基础概念与用法.分享给大家供大家参考,具体如下: 装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自 ...

  5. 什么是mysql的游标_MySQL游标概念是什么 MySQL游标概念与用法介绍

    本篇文章小编给大家分享一下MySQL游标概念与用法介绍,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 1.游标的概念(Cursor) 一条sql,对应N条资源,取出资源的接 ...

  6. STL中map和string, vector 用法详解

    1. map 用法详解 std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成 ...

  7. Java中BigDecimal类介绍及用法

    Java中BigDecimal类介绍及用法 Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高 ...

  8. C#中异步多线程的常见用法

    先来看几个基本概念(纯属个人见解,可能不准确): 进程:程序运行时,占用的全部运行资源的总和. 线程:线程是隶属于操作系统管理的,也可以有自己的计算资源,是程序执行流的最小单位.任何的操作都是由线程来 ...

  9. wrapper php,PHP流Streams、包装器wrapper概念与用法实例详解

    本文实例讲述了PHP流Streams.包装器wrapper概念与用法.分享给大家供大家参考,具体如下: 流Streams这个概念是在php4.3引进的,是对流式数据的抽象,用于统一数据操作,比如文件数 ...

最新文章

  1. Java的几种常见接口用法
  2. 12位黄金技术大佬发出警告:一大波必读好书向你袭来!
  3. Machine Learning | (10) 回归算法-岭回归
  4. DotNET企业架构应用实践-系统架构与性能-缓存技术与ORM中的缓存查询技术
  5. C++11学习之share_ptr和weak_ptr
  6. 使用opencv中的merge()函数为BGR图像添加alpha通道
  7. jquery问题,如何调用带this的函数?
  8. 称重管理系统如何修改重量_微嵌智能称重方案实现自动零件计数秤
  9. 洛谷 [P1024]一元三次方程求解【二分答案】
  10. Android Studio环境搭建
  11. linux下面拷贝pdf却没法在windows下面打开
  12. canal java_易用的 canal java 客户端 canal-client
  13. [Buzz Today]2012.09.01
  14. centos7搭建smb服务
  15. 软考-程序员-资料整理1
  16. 关于支付宝服务商模式的刷卡支付没有分润的问题
  17. 5java讲解(xy)
  18. PAT (Basic Level) Practice (中文)题目集合
  19. [ 数据通信面试篇 ] 数通面试题大集合(详解),看完直怼面试官(一)
  20. tkinter窗口布局pack方法详解

热门文章

  1. 三分钟构建自动化运维平台-nightingale(夜莺)
  2. 用Qt编写STM32烧录软件(ISP模式)代码
  3. 如何使用R语言的Boruta包进行特征选择
  4. 公司年底裁员,程序员表示给赔偿就行,公司威胁:小心背景调查
  5. S2B2C商城系统平台功能模块分析,加速医药制造企业数字化转型落地
  6. Just Shuffle
  7. response 响应的各种文件格式
  8. 顺通报修管理系统维修中心管理软件
  9. 郑州各类软件开发公司各类软件开发
  10. 第08课:生活中的装饰模式——你想怎么穿就怎么穿