我创建了一个Visual Studio扩展,我想在用户选择项更改或当前项目选择更改时进行侦听。
我试着听 - 选择事件中的更改:
var dte = ServiceProvider.GlobalProvider.GetService(typeof(EnvDTE.DTE)) as DTE2;
var dteEvents = dte.Events as Events2;
var selectionEvents = dteEvents.SelectionEvents;
selectionEvents.OnChange += SelectionEventsOnOnChange;
但是 OnChange 事件不会触发。
我发现了问题。
简而言之:DTE 事件是 COM 对象,当您在本地函数中处理此类对象的事件时,我们删除了那里的 GC 引用。
解决方案:保存事件对象的私有成员。
private DTE2 _dte2;
private Events2 _dteEvents;
private SelectionEvents _selectionEvents;
private void OnLoaded()
{
_dte2 = ServiceProvider.GlobalProvider.GetService(typeof(EnvDTE.DTE)) as DTE2;
_dteEvents = _dte2.Events as Events2;
_selectionEvents = _dteEvents.SelectionEvents;
_selectionEvents.OnChange += SelectionEventsOnOnChange;
}