【问题标题】:Visual Studio OrderedTests: COM object that has been separated from its underlying RCW cannot be usedVisual Studio OrderedTests:无法使用已与其底层 RCW 分离的 COM 对象
【发布时间】:2017-11-09 20:30:50
【问题描述】:

首先,这里使用的技术包括: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 被删除时它也会立即抛出异常(即使睡眠定时器还没有完成)。

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

【问题讨论】:

    标签: c# excel unit-testing com rcw


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答!我在我的框架中重写了读/写类以使用 EPPLus NuGet,它立即解决了我遇到的 COM 问题。
    【解决方案2】:

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

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

    【讨论】:

    • @OsakaRyhmes 感谢您的回复!我尝试在发布模式下运行框架,但 COM 问题仍然存在。通过切换到 EPPlus NuGet,我能够解决问题。
    猜你喜欢
    • 2011-11-21
    • 2012-04-27
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 2012-09-17
    • 2011-07-15
    相关资源
    最近更新 更多