代码之家  ›  专栏  ›  技术社区  ›  user180326

从外部线程调用时,.NET单元测试崩溃,并显示“无法跨AppDomain传递gcHandle”

  •  5
  • user180326  · 技术社区  · 15 年前

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

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

    现在,当我正常运行我的代码时,这些东西就可以工作了,但是当从resharper运行单元测试时,它会失败,并出现错误“cannot pass a gchandle across appdomain”。

    似乎出错的是,resharper在其testranner中使用appdomain,而directshow线程不知何故与此appdomain没有关联。

    那么,我如何使这个测试从Resharper开始工作呢?是否有nunit/resharper设置来控制是否使用AppDomain?我能告诉clr某个线程与某个特定的appdomain关联吗?你知道其他实用的解决方法吗?

    蒂亚扬

    2 回复  |  直到 15 年前
        1
  •  5
  •   user180326    15 年前

    我设法让它按照 http://www.lenholgate.com/archives/000856.html

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

        2
  •  1
  •   Igal Tabachnik    15 年前

    您没有提到正在使用的Resharper版本。尝试使用最新版本运行测试 ReSharper 5.0 Nightly Build . 那里的人重写了测试运行程序,天真地支持努尼特。如果这不起作用,我建议你在他们的新网站上把这作为一个问题报告。 Bug Tracking system .