c# - vsix 实验实例中的事件仅工作一次
问题描述
我创建了一个 VSIX 项目包并添加了一些事件,如果调试器启动,应该调用这些事件。
[PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] // Info on this package for Help/About
[ProvideAutoLoad(UIContextGuids80.Debugging)]
[Guid(FirstPackage.PackageGuidString)]
public sealed class FirstPackage : AsyncPackage, _dispDebuggerEvents
{
public const string PackageGuidString = "5ed493bb-1bfd-4946-a427-e400ee8653d9";
protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
{
// Garbage Collector ?
await base.InitializeAsync(cancellationToken, progress);
await this.JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
EnvDTE80.DTE2 dte = (EnvDTE80.DTE2)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(DTE));
DebuggerEvents _debuggerEvents = dte.Events.DebuggerEvents;
_debuggerEvents.OnEnterRunMode += OnEnterRunMode;
_debuggerEvents.OnEnterBreakMode += OnEnterBreakMode;
}
public void OnEnterRunMode(dbgEventReason Reason)
{
// do some stuff
}
public void OnEnterBreakMode(dbgEventReason Reason, ref dbgExecutionAction ExecutionAction)
{
// do some other stuff
}
这是我当前的代码。如果我启动程序,事件会被初始化,并且通过在我的实验实例中启动调试器也会触发。我当前的问题是,它仅在我第一次调试实验实例时才起作用。
解决方案
您只需要确保 DebuggerEvents 不会超出范围,这样您的事件处理程序就不会被 .NET 垃圾收集器吃掉。
例如:
public sealed class FirstPackage : AsyncPackage, _dispDebuggerEvents
{
public const string PackageGuidString = "5ed493bb-1bfd-4946-a427-e400ee8653d9";
private DebuggerEvents _debuggerEvents;
protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
{
// Garbage Collector ?
await base.InitializeAsync(cancellationToken, progress);
await this.JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
EnvDTE80.DTE2 dte = (EnvDTE80.DTE2)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(DTE));
_debuggerEvents = dte.Events.DebuggerEvents;
_debuggerEvents.OnEnterRunMode += OnEnterRunMode;
_debuggerEvents.OnEnterBreakMode += OnEnterBreakMode;
}
推荐阅读
- python - 带有 sqlite3 的 Python - 运行几分钟后输入随机值
- pandas - 在情节线图中删除数千(k)
- javascript - 用 JS 将 div 注入我的网站(无法编辑主主题文件)这可能吗?
- javascript - 在 javascript 中嵌套 .then 以进行 firebase 操作
- d3.js - 如何计算 D3 中矩形之间的距离?
- selenium - 一个非常不可思议的问题,Maven变得顽皮,selenium 4.0.0-beta-1
- r - 以相同的顺序将模式的所有元素与向量匹配
- python - 组合两个数据帧,使一个数据帧中的值成为另一个数据帧的标头
- linux - SUID find -exec TCP 连接不是 root
- javascript - Node.js MySQL 连接错误。被拒绝