Как проверять XML-потоки от отладчика в Visual Studio 2003

Мне нужно отредактировать таблицу стилей XSLT, но я летел слепой, потому что XML-вход существует только мгновенно в связке потоков. Я могу отлаживать код, но не могу понять, как получить содержимое потоков в текст, на который я могу смотреть (и запускать XSLT вручную, пока я их редактирую).

Этот код является частью большой старой унаследованной системы, я могу изменить его в среде отладки, если это абсолютно необходимо, но он работает в службе Windows, связанной с кучей MSMQ. Поэтому по разным причинам я предпочел бы использовать отладчик для просмотра XML без необходимости сначала менять код.

Код значительно упрощен, это примерно так: (С# - но помните его .net 1.1 в VS 2003.)

Это функция, которая получает XML как поток, который затем передается в какой-то объект преобразования XSLT. Я попытался взглянуть на объекты writer и xmlStream в окнах часов и на ближайшее окно, но не могу понять, как увидеть фактический XML.

private MemoryStream GetXml()
{
    MemoryStream xmlStream;
    xmlStream = new MemoryStream();
    XmlWriter writer = new XmlTextWriter(xmlStream, Encoding.UTF8);
    writer.WriteStartDocument();
    //etc etc...
    writer.WriteEndDocument();
    writer.Flush();
    xmlStream.Position = 0;
    return xmlStream; //Goes off to XSLT transform thingy!
}

Вся помощь очень ценится.

Ответ 1

Вы можете просто добавить это выражение в окно просмотра после готовности MemoryStream:

(new StreamReader(xmlStream)).ReadToEnd();

Смотреть выражения не должны быть простыми значениями переменных. Они могут быть сложными выражениями, но они будут иметь побочные эффекты. Как вы заметили, это приведет к прерыванию выполнения, так как содержимое потока будет полностью считываться. Вы можете воссоздать поток после прерывания с другим выражением, если вам нужно снова запустить выполнение.

Эта ситуация возникает часто при отладке кода с потоками, поэтому я избегаю их для простых автономных задач. К сожалению, для больших систем не всегда легко заранее знать, следует ли вам ориентировать свой код на поток или нет, поскольку он сильно зависит от того, как он будет использоваться. Однако во многих случаях использование потоков является преждевременной оптимизацией.

Ответ 2

ОК, мне не удалось использовать отладчик без изменения кода. Я добавил в следующий фрагмент, который позволяет мне либо поставить точку останова, либо использовать debugview.

private MemoryStream GetXml()
{
    MemoryStream xmlStream;
    xmlStream = new MemoryStream();
    XmlWriter writer = new XmlTextWriter(xmlStream, Encoding.UTF8);
    writer.WriteStartDocument();
    //etc etc...
    writer.WriteEndDocument();
    writer.Flush();
    xmlStream.Position = 0;

    #if DEBUG
    string temp;
    StreamReader st=new StreamReader(xmlStream);
    temp=st.ReadToEnd();
    Debug.WriteLine(temp);
    #endif

    return xmlStream; //Goes off to XSLT transform thingy!
}

Я бы предпочел просто взглянуть на объект xmlstream в отладчике, даже если он нарушит поток исполнения, но тем временем это лучшее, что мне удалось.