从外部线程调用时,.net 单元测试崩溃并显示 "Cannot pass a GCHandle across AppDomains"

标签 .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 在其测试运行程序中使用 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/

相关文章:

nunit - 如何测试两个日期是否在 NUnit 中的某个容差范围内?

tfs - 将 NUnit 与 TFS 2010 一起使用? (特别是报告)

visual-studio - 无法加载 UI 卫星 dll 'FileTracker32UI.dll'

c - 包含名为 "generic"的变量的结构无法在 C++/CLI 项目中编译

c# - 将属性应用于分部类

c# - C#中动态创建数组的方法

c# - Stream.Length 抛出 NotSupportedException

c# - 验证 TextBox 中的文本更改

c# - nunit 如何成功等待 async void 方法完成?

c++ - C#WPF和C++/CLI和C++在C++/CLI中添加外部库错误