System.AccessViolationException使用Excel.Worksheet.Copy时

我们有一个Excel的VSTO插件。 主要function创build用于生成工作簿的报告。 当我运行一批报告时,使用Excel.Worksheet.Copy时会出现System.AccessViolationExceptionexception,这也会导致Excel崩溃。 以下是我如何重新创build它:

1)使用创build一个工作簿的单个参数打开并运行报告#1。 我们closures工作簿。 2)打开并运行几个参数相同的报告。 这创build了5个工作簿,但是在创build第二个工作簿时却崩溃了,但是只有运行了第一个单一输出报告(参见步骤1)。 如果我们从批次中删除步骤1中的报告,则会创build全部5个工作簿,而不会出错。

我已经检查过,以确保我们正在复制的工作表是从工作簿打开的,而不是引用第一个报告。 事实上,我们closures了第一个,所以我知道它不是。 同样,如果我们在第一步中有报告,而根本没有访问,那么这只会发生,那么如何影响一张完全不同的工作簿中的工作表呢?

这甚至没有完成我的try / catch,以便我可以得到更多的信息。 它只是吹了Excel,我不得不重新启动。

更新:这是基本的代码:

function void ReplaceSheets(Dictionary<Excel.Worksheet, IReportSheet> sheetReports) { List<string> oldNames = new List<string>(sheetReports.Count); foreach (Excel.Worksheet oldSheet in sheetReports.Keys) { Excel.Worksheet veryHiddenSheet = null; Excel.Worksheet newSheet = null; try { string sheetName = oldSheet.Name; veryHiddenSheet = WorkbookHelper.FindSheet(this.DocumentView, MakeHiddenSheetName(sheetName, "--VH--")); veryHiddenSheet.Visible = Excel.XlSheetVisibility.xlSheetVisible; //Sheet has to be visible to get the copy to work correctly. veryHiddenSheet.Copy(this.DocumentView.Sheets[1], Type.Missing);//This is where it crashes newSheet = (Excel.Worksheet)this.DocumentView.Sheets[1]; //Get Copied sheet /* do other stuff here*/ } finally { veryHiddenSheet = null; newSheet = null; } } } 

我从来没有在VSTOfind解决这个问题的方法。 我将代码切换到NetOffice ,我能够得到一些更好的错误信息。 Excel / Com没有发布附加到电子表格的内存。 我从空白的2010电子表格中重build了报告,并处理了它。 我认为这是一个损坏的2007年电子表格,可能发生在转换到2010年或类似的东西。 我推荐使用NetOffice而不是VSTO,因为exception处理要优越得多,而且你可以访问源代码,但是它确实存在一些怪癖。 (您需要注意加载任务栏的顺序。)