RaceOnRCWCleanup при закрытии приложения WPF с помощью COM и «Включить отладку неуправляемого кода» - PullRequest
2 голосов
/ 09 марта 2011

Во время разработки моего WPF-приложения я неожиданно получил, казалось бы, страшный RaceOnRCWCleanup при закрытии приложения во время отладки.При выполнении без отладчика все было нормально.

Изображение и текст предупреждения:

enter image description here

Помощник по управляемой отладке 'RaceOnRCWCleanup' обнаружилпроблема в 'MyEXE'.Дополнительная информация: Была предпринята попытка освободить используемый RCW.RCW используется в активном потоке или другом потоке.Попытка освободить используемый RCW может привести к повреждению или потере данных.

Трассировка стека была не очень полезна:

[External Code] 
>   mscoreei.dll!000007fef75c3309()     
    [Frames below may be incorrect and/or missing, no symbols loaded for mscoreei.dll]  
    mscoree.dll!000007fef7655b21()  
    kernel32.dll!0000000077b7f56d()     
    ntdll.dll!0000000077cb2cc1()    

Со времени последнего большого изменения, которое я сделал ранеек ошибке, возникающей в первый раз, было использование объекта COM из моего управляемого кода C #, я, очевидно, подозревал, что OCX (написанный мной).Поиск в сети и в стеке не дал никакого решения.

Тогда я обнаружил, что это происходит только тогда, когда активирован параметр «Включить отладку неуправляемого кода» .Я сделал это, потому что хотел отлаживать OCX, написанный на неуправляемом C ++.Отключение отладки неуправляемого кода немедленно устраняет проблему.

Это произошло в Windows 7, Visual Studio 2010 без SP1.

У кого-нибудь есть объяснение, что здесь происходит?Это ошибка?

Обновление: Эта проблема исчезла, когда я установил пакет обновления 1 для Visual Studio 2010.

1 Ответ

1 голос
/ 09 марта 2011

Не так много, чтобы пройти. Однако не обращайте внимания на это предупреждение, если вы получаете его от преждевременного завершения сеанса отладки. Это вызвано тем, что MDA замечает завершение потока, который имеет ожидающий вызов интерфейса COM, который маршалируется. Использование Debug + Stop Отладка может отключить это предупреждение, оно прерывает потоки.

...