Visual Studio SDK - 处理文件添加、删除和重命名事件

2023-12-05

我正在开发一个 Visual Studio 扩展,当用户在当前解决方案中添加、删除或重命名文件时,该扩展应该侦听事件。

答案是这个问题注意到 VS 提供了用于监听文档事件的基础设施,例如通过文档事件界面。例如:

Dte.Events.DocumentEvents.DocumentSaved

是否有类似的事件允许我监听用户添加/删除/重命名文档?


首先,如果可以的话,不要使用 DTE。这是一个非常不完整、不稳定的抽象,覆盖在一个极其复杂的界面上。话虽如此,我承认有时它非常方便,因为没有它就无法完成等效操作(罕见),或者替代代码会很长(不太罕见)。

这里混淆了两个概念。第一个是运行文档表(RDT)。 RDT 代表所有打开的文件(包括打开的 .sln 和项目文件)。您可以订阅 RDT 事件,以便在文件被打开、关闭、重命名等时收到通知。但这些事件仅适用于打开的文件!

第二个概念是项目制。解决方案资源管理器中加载和显示的每个项目均由该项目类型的项目系统加载。 C++ 项目、C# 项目、F# 项目、WIX 安装程序项目等都有不同的项目系统。甚至可以通过扩展实现自定义项目系统。听起来您想了解项目系统中的事件,而不是(仅)打开文件的事件。所以你的重点是项目系统。然而,由于所有项目系统都有不同的实现,这变得非常棘手。 VS 正在向通用项目系统 (CPS) 迈进,但还没有 100% 实现,即使实现了,仍然存在所有遗留扩展等问题。

您可以订阅所有项目系统必须提供的常规“层次结构”事件。例如,他们会告诉您何时添加或删除文件(实际上,当添加或删除层次结构项目(节点)时,因为文件和层次结构项目之间不一定存在对应关系)。还有一个事件表明整个层次结构已失效 - 一种刷新,您必须放弃您所了解的有关项目的所有信息并收集新信息。

重命名可能是最难检测的事情。每个项目系统的实现方式都不同。在某些项目系统中,重命名将表现为节点删除,然后添加节点,没有可靠的方法来识别这是由于重命名造成的。

总而言之,没有什么事情像看起来那么简单,特别是当涉及到项目系统(Visual Studio 中可扩展性最差的部分之一)时。您最终可能会得到特定于一个或少数项目系统的代码,但不能普遍工作。 (毕竟,并非所有项目都代表文件层次结构!而那些确实代表文件层次结构的项目仍然具有文件夹、特殊参考节点等,但它们不是文件。)

一些正确方向的具体指针:

  • 实施IVsSolutionEvents3收到项目正在加载/卸载的通知(以及IVsSolutionEvents4收到项目本身被重命名的通知)。通过以下方式在包初始化代码中将该对象注册为侦听器(确保在打开解决方案之前加载包)SVsSolution服务(投射到IVsSolution并打电话AdviseSolutionEvents on it).
  • 实施IVsHierarchyEvents收到项目更改的通知,例如节点属性更改(使用__VSHPROPID枚举以找出哪个是哪个),节点被添加、删除、失效等。调用AdviseHierarchyEvents on the IVsHierarchy对象传递给IVsSolutionEvents3's OnAfterProjectOpen实现注册事件监听器对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual Studio SDK - 处理文件添加、删除和重命名事件 的相关文章

  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 如果没有 /// 标签,TypeScript 的“将 JavaScript 输出合并到文件中”选项无法推断出正确的脚本顺序

    我正在开发一个使用 将 JavaScript 输出合并到文件中 选项的 TypeScript 解决方案 我经常引用另一个文件中定义的项目 例如 In MyBaseClass ts export class MyBaseClass In My
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • Visual Studio,应用程序设置...重新排列

    愚蠢的问题 纯粹是审美 鉴于上面的图片 如何上移 下移值 例如 状态 属于 高度 宽度 顶部 左侧 窗口位置 状态 分组 这不是我后来添加东西但慢慢变得混乱的唯一项目 可以删除 重新添加 但这会变得乏味且容易出错 可以保留原样 但这只是一个
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内

随机推荐