我正在编写一个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
答案 0 :(得分:5)
我设法让它使用http://www.lenholgate.com/archives/000856.html
中描述的程序这描述了如何在托管类中创建一个非托管函数指针。当您调用此函数指针时,您将进入最初创建对象的托管应用程序域。这修复了我的appdomain错误。
答案 1 :(得分:1)
您没有提到您正在使用的ReSharper版本。尝试使用最新的ReSharper 5.0 Nightly Build运行测试。那里的家伙改写了测试运动员以天真地支持Nunit。如果这不起作用,我建议您在新的Bug Tracking system报告此问题。