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

Bra*_*rad 8 c# excel interop using

我正在尝试打开一个(实际上有数百个)excel文件.我打开应用程序但想要在我打开的每个工作簿周围使用Using()功能.为什么会导致错误?

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

使用获取红色下划线并说"'Microsoft.Office.Interop.excel.Workbook':在using语句中使用的类型必须可以隐式转换为'System.IDisposable'.

如何使这项工作?

Rup*_*Rup 30

几乎就是它所说的 - 你只能使用using实现IDisposable的类,因此编译器知道在最终化时调用哪个函数 - yourclass.Dispose().Excel互操作类不实现此功能.

所以你有两个选择:

  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
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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();
    }
    
    Run Code Online (Sandbox Code Playgroud)