Visual Studio OrderedTests:COM对象已与其基础RCW分离,无法使用



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

我正在构建一个自动化框架来测试多个web应用程序。我使用Excel电子表格来提取变量数据,这样其他测试人员就可以更轻松地使用测试了。在烟雾测试期间,我们按顺序运行了我构建的几个单元测试。因此,我认为创建有序测试是个好主意。当单独运行每个测试时,它们运行得很好。然而,一旦我开始运行有序测试,列表中的第一个测试就会运行,但随后我会出现以下错误:

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

我在一个名为ReadFile:的类中创建了对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;

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

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

我做了很多研究,发现可能需要调用Mashall.FinalReleaseComObject。我也尝试过使用它,但似乎没有什么区别。我还注意到,在第一次测试完成后,Excel进程会继续运行几秒钟。所以我试着让线程休眠,让它在下一次测试开始前等待Excel完全关闭,但当Excel被删除时,它也会立即抛出异常(即使休眠计时器还没有完成)。

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

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

您是否在调试模式下运行/测试它?如果是这样,则GC忽略了COM对象,并且它没有被正确释放。这大概是我所理解的。我最近在另一个SE线程中找到了这个解决方案作为答案。如果我能找到线程,我会把它链接起来。解决办法是在发布模式下运行,看看问题是否仍然存在。

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

此异常:

System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used.

以及:

System.Runtime.InteropServices.InvalidComObjectException: Attempt has been made to use a COM object that does not have a backing class factory.

可能是由于在使用完COM对象之前释放了它。因此,请检查并仔细检查对Marshal.ReleaseComObject的调用,并确保在调用后没有尝试访问该对象。

注意:我不认为这是OP的问题,但这可能会帮助其他来到这里寻找这些异常信息的人。

最新更新