订阅 DTE 事件似乎不起作用 - 事件不会被调用

2024-01-01

我在包内进行了扩展,并调用以下代码(当用户按下工具栏中的按钮时发生):

DocumentEvents documentEvents = (DTE2)GetService(typeof(DTE));
_dte.Events.DebuggerEvents.OnEnterBreakMode += DebuggerEvents_OnEnterBreakMode;
_dte.Events.DebuggerEvents.OnEnterDesignMode += DebuggerEvents_OnEnterDesignMode;
_dte.Events.DebuggerEvents.OnContextChanged += DebuggerEvents_OnContextChanged;
_dte.Events.DocumentEvents.DocumentSaved += new _dispDocumentEvents_DocumentSavedEventHandler(DocumentEvents_DocumentSaved);
_dte.Events.DocumentEvents.DocumentOpened += new _dispDocumentEvents_DocumentOpenedEventHandler(DocumentEvents_DocumentOpened);
void DocumentEvents_DocumentOpened(Document Document)
{
}

void DocumentEvents_DocumentSaved(Document Document)
{
}

void DebuggerEvents_OnEnterBreakMode(dbgEventReason Reason, ref dbgExecutionAction ExecutionAction)
{
}

void DebuggerEvents_OnContextChanged(Process NewProcess, Program NewProgram, Thread NewThread, StackFrame NewStackFrame)
{
}

private void DebuggerEvents_OnEnterDesignMode(dbgEventReason reason)
{
}

第一个也是主要的问题是事件订阅不起作用。我试过了:

  • 打开新文档
  • 脱离调试(因此据说触发 OnEnterDesignMode
  • 保存文档

这些似乎都没有任何效果,并且回调函数从未被调用。

第二个问题是对事件线的订阅通常有效(订阅本身,回调不起作用,如上所述),但在运行订阅线一段时间后,例如:

_dte.Events.DebuggerEvents.OnEnterBreakMode -= DebuggerEvents_OnEnterBreakMode;

导致异常:

Exception occured!
System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used.
   at System.StubHelpers.StubHelpers.StubRegisterRCW(Object pThis, IntPtr pThread)
   at System.Runtime.InteropServices.UCOMIConnectionPoint.Unadvise(Int32 dwCookie)
   at EnvDTE._dispDebuggerEvents_EventProvider.remove_OnEnterDesignMode(_dispDebuggerEvents_OnEnterDesignModeEventHandler A_1)

任何想法都会受到欢迎

谢谢! 维塔利


发布一个answer http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/7ec92d44-afa0-4778-bea4-6cbdd658962c?prof=required这是我从 Ryan Molden 的 MSDN 论坛上获得的,以防它对任何人有帮助:

我相信这里的问题是如何 CLR 处理 COM 端点(事件 水槽)。如果我没记错的话 你击中了 _applicationObject.Events.DebuggerEvents CLR 将作为你的“链”的一部分 创建一个新的 DebuggerEvents 对象 属性访问并且不会缓存 它,因此它又回到你身边,你 向它注册一个事件处理程序(其中 在之间创建强有力的参考 临时对象和您的到期对象 给代表,但不是来自您的 对象到临时对象,其中 会阻止 GC)。那你不 将该对象存储在任何地方,所以它是 立即符合 GC 资格并将 最终被 GC 处理。

我更改了代码以将 DebuggerEvents 存储为字段,一切开始正常工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

订阅 DTE 事件似乎不起作用 - 事件不会被调用 的相关文章

随机推荐

  • C++ map<字符,静态方法指针>? [复制]

    这个问题在这里已经有答案了 我编写了一个非常基本的表达式解析器 我希望它是可扩展的 以便它可以解析用户定义的表达式类型 例如 如果在解析时我遇到了字符 lt 我想创建一个类的实例 用于解析以此字符开头的表达式 我有两个问题 如何将字符与静态
  • 有没有办法自动生成有效的算术表达式?

    我目前正在尝试创建一个 Python 脚本 它将自动生成有效的空格分隔算术表达式 但是 我得到的示例输出如下所示 32 42 95 24 53 21 虽然空括号对我来说完全没问题 但我无法在计算中使用这个自动生成的表达式 因为 24 和 5
  • ORA-01704: 字符串文字太长 '在 Oracle XMLTYPE 列类型中插入 XML 文档时出错'

    当我尝试将 SQL 表中的数据插入 Oracle 表时 出现此错误 ORA 01704 字符串文字太长 在我的 Oracle 表中 有一列具有 XMLTYPE 列类型 当我创建表时 我指定了 XML 列 如下所示 CREATE TABLE
  • phpmyadmin、neginx error.log - 检查组 www-data 是否具有读取权限和 open_basedir

    我在 phpmyadmin 网站上有此消息 phpMyAdmin 配置存储未完全配置 一些扩展功能已被停用 要了解原因 请点击此处 在 单击此处 页面上 我有以下内容 页面打印屏幕 https www dropbox com s vhh4v
  • 在 Swift 中从 AVCaptureSession 捕获静态图像

    我有一个AVCaptureSession在 UIView 中显示实时视频 我想将视频流的一帧保存为 UIImage 我一直在剖析我在互联网上不断看到的代码 但我在第一行遇到了问题 if let stillOutput self stillI
  • 在打字稿文件上启用 Eslint

    在 webstorm eslint 设置中 有一个 额外 eslint 选项 字段 在此 我补充道 ext ts 来自埃斯林特文档 http eslint org docs user guide command line interface
  • 乘客问题:“没有要加载的文件”--/config/environment

    我一直在研究这个问题 并到处发现类似问题的参考资料 但尚未找到解决方案 我已经安装了 guest 2 2 11 和 nginx 0 7 64 当我启动并点击 Rails URL 时 我收到一个错误页面 通知我加载错误 没有要加载的文件 pa
  • 按下“Ctrl + C”按钮处理 C# 控制台应用程序

    如何处理同时按下的两个按钮 Ctrl C 不是在 WindowsForms 应用程序中 而是在控制台 C 应用程序中 我怀疑你想设置Console TreatCtrlCAsInput http msdn microsoft com en u
  • UIBarButton 没有改变

    IBOutlet weak var playStopButton UIBarButtonItem var playStopArray UIBarButtonSystemItem Pause UIBarButtonSystemItem Pla
  • pandas udf showString 简单示例错误

    我开始在使用此 身份 pandas udf 在 EMR 集群上运行的 Pyspark Jupyter 笔记本上使用 pandas udf 并且收到以下错误 pandas udf df schema PandasUDFType GROUPED
  • 批量将文件从子文件夹移动到父文件夹

    这是我的场景 这是我的文件夹结构 C DOCS Project1 docname1 image jpg docname2 image jpg docname3 image jpg C DOCS Project2 docname1 image
  • 什么样的面试问题适合 C++ 手机屏幕?

    很想了解人们的想法 我经常进行采访 在我的职业生涯中已经有足够多的时间来反思这些采访 并且我注意到了各种各样的问题 我专门做了这个 C 但值得注意的是 有人通过电话问我算法复杂性问题 我什至不是指哈希查找与二叉树的复杂性 我的意思更像是分析
  • 在 Oracle SQL / PL-SQL 中将德语特殊字符转换为英语等效字符

    我想将表的一列中的所有德语字符替换为相应的英语字符 当我尝试使用 Replace 函数时 它没有返回丰硕的结果 我想将所有德语特殊字符替换为 Ae Oe Ue oe ae ue ss 请让我知道如何执行 我需要更改任何数据库设置吗 请在下面
  • Python 3.4 解码字节

    我正在尝试用 python 编写一个文件 并且在编写文件之前找不到解码字节对象的方法 基本上 我正在尝试解码这个字节字符串 Les xc3 x83 xc2 xa9vad xc3 x83 xc2 xa9s 这是我试图恢复的原始文本 Les v
  • 使用 .net core 为 NLog 注入服务的自定义目标

    我正在使用 NLogNLog Extensions Logging用于 aps net 核心支持 我需要创建一个自定义目标并将服务注入到目标的构造函数中 以下代码永远不会被执行 public MyTarget IService servic
  • 在前台服务中运行网络代码后仍然收到“网络使用过多(后台)”警告

    通过参考处理和解决 网络使用过多 后台 的正确方法 https stackoverflow com questions 54489501 proper way to tackle and resolve excessive network
  • 最短路径图算法助力Boost

    我有一个矩形网格形状的 DAG 其中水平边缘始终指向右侧 垂直边缘始终指向下方 边缘具有与之相关的正成本 由于矩形格式 节点使用从零开始的行 列来引用 这是一个示例图 现在 我想进行搜索 起始顶点将始终位于左列 索引为 0 的列 和图的上半
  • 在链接上切换活动课程

    给定一个在两个类之间切换的脚本 我还向当前选定的链接添加一个活动状态 以设置下划线来显示活动状态 但是 当连续单击链接时 它会不断添加活动类 而不是打开和关闭该类 如何在单击链接时显示活动状态 并在单击另一个链接时关闭并应用于另一个链接 J
  • Excel 文件的 Oledb 连接字符串

    这是我在加载 excel 2003 文件时使用的 oledb 连接字符串 但我收到错误消息 无法找到可安装的 ISAM 请帮助我解决这个问题 我在这里做错了什么 Provider Microsoft Jet OLEDB 4 0 Data S
  • 订阅 DTE 事件似乎不起作用 - 事件不会被调用

    我在包内进行了扩展 并调用以下代码 当用户按下工具栏中的按钮时发生 DocumentEvents documentEvents DTE2 GetService typeof DTE dte Events DebuggerEvents OnE