为什么这个Using()会给我一个错误?

我正在尝试打开(几百个)excel文件。 我打开该应用程序,但希望在打开的每个工作簿周围使用Using()function。 为什么这会导致错误?

using (Excel.Workbook wbXL = appXL.Workbooks.Open(_sourceFullPath, Type.Missing, Excel.XlFileAccess.xlReadOnly)) { //stuff with wbXL } 

使用获取红色下划线,并说“'Microsoft.Office.Interop.excel.Workbook':使用using语句中的types必须隐式转换为'System.IDisposable'。

如何使这项工作?

几乎所说的 – 你只能使用实现IDisposable的类来using ,所以在编译器的封面下,编译器知道哪个函数需要调用finalization – yourclass.Dispose() 。 Excel互操作类不执行此操作。

所以你有两个select:

  1. 编写你自己的包装类,用于实现IDispose的Excel.Workbook,并且暴露对象本身以调用方法,或者封装这些方法,例如

     public class DisposableWorkbook : IDisposable { private Excel.Workbook _workbook = null; public DisposableWorkbook(Excel.Application appXL, String path, NotSureOfType otherArgument, Excel.XlFileAccess access) { _workbook = appXL.Workbooks.Open(path, otherArgument, access); } public Excel.Workbook Workbook { get { return _workbook; } } public void Dispose() { if (workbook != null) { workbook.Close(Excel.XlSaveAction.xlDoNotSaveChanges, workbookToClose); workbook = null; } } } using (DisposableWorkbook dwbXL = new DisposableWorkbook(appXL, _sourceFullPath, Type.Missing, Excel.XlFileAccess.xlReadOnly)) { Excel.Workbook wbXL = dwbXL.Workbook; // stuff with wbXL } 
  2. using你自己,例如

     Excel.Workbook wbXL = null; try { wbxl = appXL.Workbooks.Open(_sourceFullPath, Type.Missing, Excel.XlFileAccess.xlReadOnly); //stuff with wbXL } finally { if (wbxl != null) wbxl.Close(); } 

using语句中的任何项都必须实现IDisposable接口。 我没有收到文档,但我猜Excel.Workbook不会实现这个接口。

使用语句(C#参考) :

提供一个方便的语法来确保正确使用IDisposable对象。

Excel.Workbook不实现IDisposable ,所以你不能使用它。

你不能使它工作。

using块用于尽可能快速和安全地从实现IDisposable接口的对象中释放资源。

Excel.Workbook不实现IDisposable所以你不能声明它用于使用块。

 Businessmanger emb = new Businessmanger(); try { TempData["deparmentList"] = Deplist; return PartialView("create"); } catch (Exception) { throw; } finally { //object dispose here ((IDisposable)emb).Dispose(); } 
Interesting Posts