Visual Studio OrderedTests:无法使用与其底层 RCW 分离的 COM 对象

Visual Studio OrderedTests: COM object that has been separated from its underlying RCW cannot be used

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

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

System.Runtime.InteropServices.InvalidComObjectException: 无法使用与其底层RCW分离的COM对象。

我在名为 ReadFile 的 class 中创建了对 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 被移除时它也会立即抛出异常(即使睡眠计时器尚未完成).

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

你running/testing这是在调试模式吗?如果是这样,则 GC 忽略了 COM 对象并且未正确释放它。我的理解大概就是这样。我最近在另一个 SE 线程中找到了这个解决方案作为答案。如果我能找到线程,我会 link 它。解决方法是 运行 在发布模式下,看看问题是否仍然存在。

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

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