Visual Studio OrderedTests:已经从其基础RCW分离的COM对象不能使用

首先,这里使用的技术包括:Visual Studio,C#,Selenium WebDriver,Google Chrome和MS Excel。

我正在构build一个自动化框架来testing多个Web应用程序。 我正在使用Excel电子表格来提取variables数据,以便其他testing人员使用testing更容易。 在我们的烟雾testing过程中,我们通过了几个我已经编制好的unit testing。 因此,我认为创build一个有序testing是一个好主意。 当单独运行每个testing时,他们工作得很好。 但是,一旦我开始运行有序testing,列表中的第一个testing将运行,但是我得到这个错误:

System.Runtime.InteropServices.InvalidComObjectException:不能使用已从其基础的RCW分离的COM对象。

我在名为ReadFile的类中创build对Excel电子表格的引用:

static Excel.Application xlApp = new Excel.Application(); static Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(@"SPREADSHEET LOCATION"); static Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1]; static Excel.Range xlRange = xlWorksheet.UsedRange; 

当我的testing通过或失败时,他们调用CleanUp方法,它包括退出chromedriver并调用ReadFile.Close()方法:

 xlWorkbook.Save(); xlWorkbook.Close(Type.Missing, Type.Missing, Type.Missing); xlApp.Quit(); GC.Collect(); GC.WaitForPendingFinalizers(); 

我做了相当多的研究,发现可能需要调用Mashall.FinalReleaseComObject。 我也尝试过使用这个,但似乎没有什么差别。 我也注意到,第一次testing结束后,Excel进程继续运行几秒钟。 所以我试着睡觉线程,让它在下一次testing开始之前等待Excel完全closures,但是当Excel删除时(即使睡眠定时器还没有完成),它也会立即抛出exception。

无论如何,在这一点上,我正在寻找任何可能的指导,这是不胜感激。 请记住,我不是这些技术的专家。

除此之外,现在有很好的开源库(nuget包)可以用来读取excel文件,几乎和你用excel interop一样,但没有excel,从而避免了所有可能的COM障碍。 以EPPlus或ExcelDataReader为例。

你在debugging模式下运行/testing? 如果是这样,GC是忽略COM对象,并没有正确释放。 这和我的理解一样。 我最近在另一个SE线程中发现了这个解决scheme。 如果我能find线程,我会链接它。 解决scheme是在发行模式下运行,看看问题是否依然存在。

编辑: 这是解释为什么debugging模式导致GC忽略一些事情的线程。