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

.net单元测试崩溃,带“0”;无法跨AppDomains传递GCHandle“;从外部线程调用时,.net,nunit,c++-cli,resharper,appdomain,.net,Nunit,C++ Cli,Resharper,Appdomain,我正在编写一个C#单元测试来测试涉及线程的C++/CLI功能 C++/CLI代码实现了DirectShow筛选器,这是用于渲染电影的Windows API。这样,我创建DirectShow对象,告诉它通过我的C++/CLI过滤器运行AVI,等待渲染完成,然后退出。我的过滤器有一个回调,将视频帧提供给C#进行处理。DirectShow的工作原理是创建自己的线程,并从此线程调用my COM对象 现在,当我正常运行我的代码时,这些东西就可以工作了,但当从Resharper运行单元测试时,它失败了,错误

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

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

现在,当我正常运行我的代码时,这些东西就可以工作了,但当从Resharper运行单元测试时,它失败了,错误是“无法在AppDomains之间传递GCHandle”

出现问题的是Resharper在其testrunner中使用AppDomains,而DirectShow线程不知何故与此appdomain没有关联

那么我如何让这个测试在Resharper中工作呢?是否有NUnit/Resharper设置来控制是否使用appdomains?我是否可以告诉CLR某个线程与某个特定的appdomain关联?你知道其他务实的解决办法吗


TIA Jan

您没有提到正在使用的ReSharper版本。尝试使用最新版本运行测试。那里的人改写了《测试跑步者》以天真地支持Nunit。如果这不起作用,我建议您在他们的新网站上报告这一问题。

我设法按照中所述的步骤使其正常工作


这描述了如何使非托管函数指针指向托管类中的方法。调用此函数指针时,将进入最初创建对象的托管appdomain。这修复了我的appdomain错误

谢谢你给我添麻烦。在此期间,我设法解决了根本原因,但我肯定会尽快用5.0进行测试。感谢您提供此链接。在一个单独的本机线程调用托管世界的情况下,我一直在努力让我的事件系统工作。我构建了一个简单的机制,使用一个类持有
gcroot
,以防止垃圾收集我的委托+由指向我的委托的
Marshal.GetFunctionPointerForDelegate()
创建的函数指针。在我的事件触发器中,我只需调用函数指针,AppDomain转换就会自动完成。