модульный тест .net завершается с ошибкой «Не удается передать GCHandle через домены приложений» при вызове из внешнего потока - PullRequest
5 голосов
/ 15 февраля 2010

Я пишу модульный тест на C # для тестирования функциональности C ++ / CLI, включающей потоки.

Код C ++ / CLI реализует фильтр DirectShow, Windows API для рендеринга фильмов. Это работает таким образом, что я создаю объекты DirectShow, я говорю ему, чтобы он запускал AVI через мои фильтры C ++ / CLI, ждал, пока рендеринг был сделан, и затем завершал работу. Мой фильтр имеет обратный вызов, который передает видеокадры в C # для обработки. DirectShow работает таким образом, что создает собственный поток и вызывает мои COM-объекты из этого потока.

Теперь эта штука работает, когда я нормально запускаю свой код, но при запуске модульного теста из Resharper происходит сбой с ошибкой «Невозможно передать GCHandle через домены приложений».

Что кажется неправильным, так это то, что Resharper использует AppDomains в своем тестовом прогоне, а поток DirectShow каким-то образом не связан с этим доменом приложения.

Так как мне заставить этот тест работать с Resharper? Есть ли настройка NUnit / Resharper для контроля использования доменов приложений? Могу ли я как-то сообщить CLR, что поток связан с конкретным доменом приложения? Знаете ли вы какие-либо другие прагматические обходные пути?

TIA Jan

Ответы [ 2 ]

5 голосов
/ 16 февраля 2010

Мне удалось заставить его работать с помощью процедуры, описанной в http://www.lenholgate.com/archives/000856.html

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

1 голос
/ 16 февраля 2010

Вы не упомянули версию ReSharper, которую вы используете. Попробуйте запустить тесты с самой последней ReSharper 5.0 Nightly Build . Ребята там переписали тестового бегуна, чтобы наивно поддержать Nunit. Если это не работает, я предлагаю вам сообщить об этом как о проблеме на их новой системе отслеживания ошибок .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...