private void SendMessage(string message, OutputMessage.Severity severity, bool isAsync) { try { // IDebugErrorEvent2 is used to report error messages to the user when something goes wrong in the debug engine. // The sample engine doesn't take advantage of this. AD7MessageEvent eventObject = new AD7MessageEvent(new OutputMessage(message, enum_MESSAGETYPE.MT_MESSAGEBOX, severity), isAsync); Send(eventObject, AD7MessageEvent.IID, null); } catch { // Since we are often trying to report an exception, if something goes wrong we don't want to take down the process, // so ignore the failure. } }
private OutputMessage DecodeOutputEvent(Results results) { // NOTE: the message event is an MI Extension from clrdbg, though we could use in it the future for other debuggers string text = results.TryFindString("text"); if (string.IsNullOrEmpty(text)) { Debug.Fail("Bogus message event. Missing 'text' property."); return(null); } string sendTo = results.TryFindString("send-to"); if (string.IsNullOrEmpty(sendTo)) { Debug.Fail("Bogus message event, missing 'send-to' property"); return(null); } enum_MESSAGETYPE messageType; switch (sendTo) { case "message-box": messageType = enum_MESSAGETYPE.MT_MESSAGEBOX; break; case "output-window": messageType = enum_MESSAGETYPE.MT_OUTPUTSTRING; break; default: Debug.Fail("Bogus message event. Unexpected 'send-to' property. Ignoring."); return(null); } OutputMessage.Severity severity = OutputMessage.Severity.Warning; switch (results.TryFindString("severity")) { case "error": severity = OutputMessage.Severity.Error; break; case "warning": severity = OutputMessage.Severity.Warning; break; } switch (results.TryFindString("source")) { case "target-exception": messageType |= enum_MESSAGETYPE.MT_REASON_EXCEPTION; break; case "jmc-prompt": messageType |= (enum_MESSAGETYPE)enum_MESSAGETYPE90.MT_REASON_JMC_PROMPT; break; case "step-filter": messageType |= (enum_MESSAGETYPE)enum_MESSAGETYPE90.MT_REASON_STEP_FILTER; break; case "fatal-error": messageType |= (enum_MESSAGETYPE)enum_MESSAGETYPE120.MT_FATAL_ERROR; break; } uint errorCode = results.TryFindUint("error-code") ?? 0; return(new OutputMessage(text, messageType, severity, errorCode)); }