Как исправить предупреждение об обнаружении повторного входа, выдаваемое отладчиком Visual Studio?

При запуске наших модульных тестов в режиме отладки в определенный момент отладчик Visual Studio прерывается, чтобы показать реентерабельный MDA. В связанной статье объясняется, что это происходит, когда низкоуровневая точка расширения операционной системы, такая как векторный обработчик исключений, обращается обратно к коду управляемого приложения.

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

Я просматриваю stacktrace в точка, где отображается это предупреждение, но мне трудно понять, какая «точка расширения низкоуровневой операционной системы» здесь задействована. Я не вижу никаких неуправляемых/управляемых переходов, кроме одного, вызванного mstest и вызовом геттера System.Windows.Forms.Cursors.VSplit. Кроме того, простого вызова этого геттера из модульного теста недостаточно для срабатывания предупреждения.

Что я здесь сделал не так и как это исправить?


person Wim Coenen    schedule 06.04.2010    source источник
comment
@nobugz: трассировка стека уже связана.   -  person Wim Coenen    schedule 06.04.2010


Ответы (1)


Как предложил Ханс Пассанt (хотя, к сожалению, теперь он удалил свой ответ здесь), проблема в том, что в моем блоке test Я вызываю код, который предназначен только для вызова в контексте потока GUI с циклом сообщений. В модульном тесте нет такого цикла сообщений.

В этом случае проблема заключается в геттере System.Windows.Forms.Cursors.VSplit. Я вижу два способа избежать этого:

  • строго следуйте шаблону MVVM и разделяйте проблемный код в представлении, тестируйте только модель представления.
  • или скрыть код управления курсором за интерфейсом, который высмеивается в модульном тесте
person Wim Coenen    schedule 09.07.2010