【发布时间】:2020-01-30 15:30:18
【问题描述】:
我正在尝试打开 Excel 工作表,获取 UsedRange 并循环遍历它。
这已经成功了一次,但后来我遇到了异常
已经与其底层 RCW 分离的 COM 对象不能被 用过
使用后
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet);
请注意,异常也不断出现在下面的代码中,而不是在实际释放时出现。我第一次这样做,从那以后我无法让下面的代码工作。可悲的是,我不知道他到底在哪条线路上坠毁了。
由于异常不断出现,我重新启动了我的电脑,然后在尝试访问 UsedRange 时,我得到了一个异常:
System.Runtime.InteropServices.COMException:“Ausnahme von HRESULT: 0x800401A8"
代码如下:
using Excel = Microsoft.Office.Interop.Excel;
....
var xlApp = new Excel.Application();
var xlWorkBook = xlApp.Workbooks.Open(file);
Excel.Worksheet xlWorkSheet = xlWorkBook.Sheets["Tabelle1"];
for (int i = 1; i < xlWorkSheet.UsedRange.Rows.Count; i++)
{ ...
这工作了一次,所以我认为 COM 对象仍然无法正常工作。 (就像第一个例外)
我该怎么做才能让它再次工作?
【问题讨论】:
-
ReleaseComObject的需求为零。让 .NET 为您处理。见stackoverflow.com/a/29081952/585968 和stackoverflow.com/a/25135685/585968。 -
@MickyD 我现在明白了。但是我用过一次,现在我被这个错误困住了,我根本不知道如何让它工作。
-
通过调用该方法,您是在告诉 COM 您明确想要控制对象的生命周期(如果操作不正确会导致该错误),这在 .NET 中您无需担心。这不是说 c/c++