从外部线程调用时,.net单元测试崩溃,“无法通过AppDomains传递GCHandle”

时间:2010-02-15 15:51:11

标签: .net nunit c++-cli resharper appdomain

我正在编写一个C#单元测试来测试涉及线程的C ++ / CLI功能。

C ++ / CLI代码实现了DirectShow过滤器,即用于渲染电影的Windows API。这样我就可以创建DirectShow对象,我告诉它通过我的C ++ / CLI过滤器运行AVI,等待渲染完成,然后退出。我的过滤器有一个回调函数,可以将视频帧提供给C#进行处理。因此,DirectShow可以创建自己的线程并从该线程调用我的COM对象。

现在,当我正常运行我的代码时,这个东西可以工作,但是当从Resharper运行单元测试时,它失败并显示错误“无法通过AppDomains传递GCHandle”。

出现问题的是Resharper在其testrunner中使用AppDomains,而DirectShow线程在某种程度上与此appdomain无关。

那么如何从Resharper进行此测试?是否有NUnit / Resharper设置来控制是否使用appdomains?我能以某种方式告诉CLR线程与特定的appdomain相关联吗?你知道其他任何务实的解决方法吗?

TIA Jan

2 个答案:

答案 0 :(得分:5)

我设法让它使用http://www.lenholgate.com/archives/000856.html

中描述的程序

这描述了如何在托管类中创建一个非托管函数指针。当您调用此函数指针时,您将进入最初创建对象的托管应用程序域。这修复了我的appdomain错误。

答案 1 :(得分:1)

您没有提到您正在使用的ReSharper版本。尝试使用最新的ReSharper 5.0 Nightly Build运行测试。那里的家伙改写了测试运动员以天真地支持Nunit。如果这不起作用,我建议您在新的Bug Tracking system报告此问题。