在VS 2008中运行Unit Test项目时出现DisconnectedContext错误

时间:2009-08-13 14:51:27

标签: c# asp.net-mvc visual-studio-2008 unit-testing

我的解决方案中有一个单元测试项目。我不断添加新的单元测试并修改旧单元测试。几天前,运行我的单元测试项目时会出现一个消息框。消息框说:

DisconnectedContext was detected
Message: Context 0x2aae50' is disconnected.  Releasing the interfaces from the current context
(context 0x2aad98).This may cause corruption or data loss. To avoid this problem, please 
ensure that all contexts/apartments stay alive until the applicationis completely done with 
the RuntimeCallableWrappers that represent COM components that liveinside them.

如果我按“OK”,单位测试运行将被取消,如果我按“继续”,测试将按预期运行。测试不受此错误的影响(至少我不这么认为),但它非常烦人。它曾经工作正常,所以如果我在解决方案或项目上有所改变,我就不会这样做。

我检查了MSDN中有关this error的信息,并说它是由以下原因引起的:

The OLE apartment or context has been shut down when the CLR attempts to transition into it. 
This is most commonly caused by STA apartments being shut down before all the COM components 
owned by the apartment were completely released This can occur as a result of an explicit 
call from user code on an RCW or while the CLR itself is manipulating the COM component, for 
example when the CLR is releasing the COM component when the associated RCW has been garbage 
collected.

决议是:

To avoid this problem, ensure the thread that owns the STA does not terminate before the 
application has finished with all the objects that live in the apartment. The same applies 
to contexts; ensure contexts are not shut down before the application is completely finished 
with any COM components that live inside the context.

根据这个解释(老实说,我并不完全理解),我不知道为什么在运行我的单元测试项目时会发生这种情况。

所以问题是如何摆脱这个错误?

3 个答案:

答案 0 :(得分:3)

这里似乎发生的是以下

  • 您的某个组件直接或间接使用本机COM对象
  • COM对象是STA对象(大部分是IME)
  • STA COM对象基本上存在于线程上
  • 您的代码在CLR破坏COM对象之前销毁该线程

如果不了解有关COM对象的一些细节,很难说出修复是什么。通常,虽然此问题是由于无法使用COM对象在线程上泵送消息而引起的。

某些方案中,您可以使用Application.DoEvents和GC.Collect的组合来解决此问题。它还可以帮助在循环中运行它们。这可能有助于解决您的测试问题,但您的应用程序可能仍存在严重的架构问题。

答案 1 :(得分:1)

我在Visual Studio 2015中尝试使用MSTest调试单元测试时遇到了类似的问题.MSTest CollectionsAssert没有合作我的List<int[]>,所以我尝试在MSTest中包含一个NUnit CollectionsAssert单元测试,如下:

NUnit.Framework.CollectionAssert.AreEqual(Expected, Actual);

如果我在TestExplorer中右键单击测试名称并运行测试: Image showing cursor hovering over "Run Selected Tests" in VS2015

或者如果我使用CTRL+R T运行测试,那么它很乐意跑。但是,如果我尝试使用CTRL+R CTRL+T逐步调试并调试测试,那么在执行NUnit.Framework.CollectionsAssert行后我会收到类似的错误消息:

  

发生了DisconnectedContext

     

托管调试助手&#39; DisconnectedContext&#39;检测到C:\ PROGRAM FILES(X86)\ MICROSOFT VISUAL STUDIO 14.0 \ COMMON7 \ IDE \ COMMONEXTENSIONS \ MICROSOFT \ TESTWINDOW \ te.processhost.managed.exe&#39;。

     

其他信息:为此RuntimeCallableWrapper转换到COM上下文0x6bd210失败,并显示以下错误:调用的对象已与其客户端断开连接。 (来自HRESULT的异常:0x80010108(RPC_E_DISCONNECTED))。这通常是因为创建此RuntimeCallableWrapper的COM上下文0x6bd210已断开连接或正忙于执行其他操作。从当前COM上下文释放接口(COM上下文0x6bcfe8)。这可能会导致损坏或数据丢失。要避免此问题,请确保所有COM上下文/公寓/线程都保持活动状态并可用于上下文转换,直到应用程序完全使用表示其中的COM组件的RuntimeCallableWrappers完成。

当删除所有断点时出现此错误,因此它不仅仅是尝试与Visual Studio进行通信以逐步完成的问题。我最好的猜测是,以某种方式处理调试模式下运行测试的COM对象被来自不同测试框架的Assert语句中断。我不确定,但我最终只是在List<int[]>上迭代并在每个int[]上使用MSTest CollectionAssert。

答案 2 :(得分:1)

对我来说,当测试项目以Any CPU模式运行时会发生这种情况。 在Configuration Manager中为测试项目添加x86x64

如果任何依赖库具有x86x64,则测试项目将需要遵循。