C#中DTE的概念和用法

本文介绍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赋值给相应的实例对象。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光怪陆离的节日

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值