Я пишу модульный тест C# для тестирования C++ / функциональность CLI, которая включает потоки.
C++ / код CLI реализует фильтр DirectShow, Windows API для рендеринга фильмов. Это работает таким образом, что я создаю объекты DirectShow, я говорю этому выполнять AVI через свой C++ / фильтры CLI, ожидает, пока рендеринг не сделан и затем выходит. Мой фильтр имеет обратный вызов, который дает видеокадры C# для обработки. Работы DirectShow таким образом, что это создает свой собственный поток и называет мои COM-объекты от этого потока.
Теперь, этот материал работает, когда я обычно выполняю свой код, но при выполнении модульного теста от Resharper он перестал работать с ошибкой, "Не может передать GCHandle через AppDomains".
То, что, кажется, идет не так, как надо, - то, что Resharper использует AppDomains в своем testrunner, и поток DirectShow так или иначе не связан с этим appdomain.
Таким образом, как я заставляю этот тест работать от Resharper? Существует ли установка NUnit/Resharper, чтобы управлять, если appdomains используются? Я могу сказать CLR так или иначе, что поток является assocated с конкретным appdomain? Вы знаете какие-либо другие прагматические обходные решения?
TIA Jan
Мне удалось заставить его работать с помощью процедуры, описанной в http://www.lenholgate.com/archives/000856.html
Здесь описывается, как создать указатель неуправляемой функции на метод в управляемом классе. Когда вы вызываете этот указатель на функцию, вы попадаете в управляемый домен приложения, в котором изначально был создан объект. Это исправляет ошибки моего домена приложения.
Вы не упомянули версию ReSharper, которую используете. Попробуйте запустить тесты с последней версией ReSharper 5.0 Nightly Build . Там ребята переписали тестовый раннер, чтобы наивно поддержать Nunit. Если это не сработает, я предлагаю вам сообщить об этом как о проблеме в их новой системе отслеживания ошибок .