Tôi đã thực hiện một phần mở rộng bên trong một gói và tôi đang gọi mã sau đây (xảy ra khi người dùng nhấn một nút trên thanh công cụ):Đăng ký các sự kiện DTE dường như không hoạt động - Sự kiện không được gọi là
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)
{
}
Vấn đề đầu tiên và chính là đăng ký sự kiện không hoạt động. Tôi đã thử:
- Mở tài liệu mới
- Tách gỡ lỗi (do đó được cho là gây ra OnEnterDesignMode
- Lưu một tài liệu
Không ai trong số những dường như có bất kỳ tác dụng và các chức năng gọi lại là Không bao giờ được gọi là
Vấn đề thứ hai là đăng ký với sự kiện hoạt động bình thường (bản thân đăng ký, gọi lại không hoạt động như mô tả ở trên) nhưng sau một thời gian chạy dòng thuê bao, ví dụ:
_dte.Events.DebuggerEvents.OnEnterBreakMode -= DebuggerEvents_OnEnterBreakMode;
Nguyên nhân một ngoại lệ:
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)
Bất kỳ ý tưởng sẽ được chào đón
Cảm ơn! Vitaly
tôi đã cùng một vấn đề và điều này giải quyết nó. Cảm ơn! –
Bạn đã lưu 2 ngày làm việc. Bên trong gói của tôi: 'private static SolutionEvents solutionEvents; void ghi đè được bảo vệ Khởi tạo() { ApplicationObject = GetService (typeof (DTE)) làm DTE2; solutionEvents = ApplicationObject.Events.SolutionEvents;} ' – LukTar