我正在编写 C# 单元测试来测试涉及线程的 C++/CLI 功能。
C++/CLI 代码实现了 DirectShow 过滤器,即用于渲染电影的 Windows API。因此我创建 DirectShow 对象,我告诉它通过我的 C++/CLI 过滤器运行 AVI,等待渲染完成,然后退出。我的过滤器有一个回调,可将视频帧提供给 C# 进行处理。 DirectShow 的工作原理是它创建自己的线程并从该线程调用我的 COM 对象。
现在,当我正常运行我的代码时,这些东西可以工作,但是当从 Resharper 运行单元测试时,它失败并显示错误“无法跨 AppDomains 传递 GCHandle”。
似乎出错的是 Resharper 在其测试运行程序中使用 AppDomains,而 DirectShow 线程不知何故与此应用程序域无关。
那么我如何从 Resharper 进行这个测试呢?是否有 NUnit/Resharper 设置来控制是否使用 appdomains?我可以以某种方式告诉 CLR 一个线程与特定的应用程序域相关联吗?你知道其他实用的解决方法吗?
简
最佳答案
我设法使用 http://www.lenholgate.com/archives/000856.html 中描述的程序使其工作
这描述了如何使非托管函数指针指向托管类中的方法。当您调用此函数指针时,您将进入最初创建对象的托管应用程序域。这修复了我的 appdomain 错误。
关于从外部线程调用时,.net 单元测试崩溃并显示 "Cannot pass a GCHandle across AppDomains",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2267071/