如何修复“ RPC服务器不可用”与Excel文件和C#类

问题描述

我想编写一个类,该类具有几种操作Excel文件方法。我不知道在类构造函数中打开Excel文件Workbook并在类析构函数中释放所有内容(通过垃圾回收器)是否是个好主意。

using Excel = Microsoft.Office.Interop.Excel;

public class ExcelConnector
{
    private string _path = @"....xlsm";
    
    private readonly Excel.Application _xlApp;
    private readonly Excel.Workbook _xlWorkbook;
    private Excel.Workbook _xlWorksheet;
    
    public ExcelConnector()
    {
        _xlApp = new Excel.Application
        {
            displayAlerts = false,Visible = false
        };
        
        try
        {
            _xlWorkbook = _xlApp.Workbooks.Open(_path);
        }
        catch (Exception ex)
        {
            throw new Exception("Unable to open the Excel file!",ex);
        }
    }
    
    ~ExcelConnector()
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();
        
        Marshal.ReleaseComObject(_xlWorksheet);
        
        _xlWorkbook.Close();
        Marshal.ReleaseComObject(_xlWorkbook);
        
        _xlApp.Quit();
        Marshal.ReleaseComObject(_xlApp);
    }
    
    public void Process()
    {
        // Here all "Dynamic View" members of the _xlWorkbook (idem for _xlApp) have the
        // "The RPC server is unavailable. (Exception from HRESULT: 0x########)" value
        _xlWorksheet = _xlWorkbook.GetWorksheetByName("...");
        
        //...
    }

}

有人知道如何解决 RPC服务器不可用。问题?

如果我将所有填充物移至Process方法内(几乎总是),但是我有不同的方法,并且希望保持Excel文件打开(打开它需要几秒钟/分钟)。我使用Excel 2016 64位。

感谢您的见解!

更新

好吧,我忘记了从调用Process方法中重新删除以下方法,其中excelExcelConnector的实例。

// Makes sure that there is not existing instances from prevIoUs instances
excel.KillExisitingInstances();

添加了此方法,以在崩溃时杀死所有Excel实例。有点粗鲁,但有帮助...

foreach (var process in Process.GetProcessesByName("EXCEL"))
{
    process.Kill();
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)