System.Runtime.InteropServices.COMException (0x800706BA): el server RPC no está disponible. (Excepción de HRESULT: 0x800706BA)

Esta exception

System.Runtime.InteropServices.COMException (0x800706BA): The RPC server is unavailable. (Exception from HRESULT: 0x800706BA) 

se recibe en mi service de Windows cuando lo ejecuto en cualquier máquina, pero cuando lo pruebo en una aplicación de testing no se lanza ninguna exception. En mi código, lo que hago es convertir dos files .DAT en files .xls. Cuando inicio el service a través de services.msc y ejecuto el service funciona bien durante un time, pero después de actualizar ciertas filas arroja la exception y luego no sucede nada después de eso. Tengo dos funciones separadas que hacen el trabajo por separado. El código de muestra es:

  public void SaveData_component(string filename) { try { string filepath = System.Configuration.ConfigurationSettings.AppSettings["filepath"].ToString() + filename; filepath_first = filepath; object missing = Missing.Value; //string getExtension = Path.GetExtension(filepath); string getFilename = Path.GetFileNameWithoutExtension(filepath) + "New"; string filepathNew = System.Configuration.ConfigurationSettings.AppSettings["filepath"].ToString() + getFilename + ".xls"; try { xlAppNew1 = new Application(); xlAppNew1.DisplayAlerts = true; workbooks1 = xlAppNew1.Workbooks; workbook1 = workbooks1.Open(@filepath, 0, true, 1, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); // xlWorkSheet1 = (Microsoft.Office.Interop.Excel.Worksheet)workbook1.Worksheets.get_Item(1); xlAppNew1.ActiveWorkbook.SaveAs(@filepathNew, -4143, "", "", false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing); string getExtension = ".xls";//Path.GetExtension(filepathnew); //string getFilename = Path.GetFileNameWithoutExtension(filepathnew); string connString = ""; if (getExtension.ToLower() == ".xls") connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepathNew + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\""; else connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepathNew + ";Extended Properties=Excel 12.0 Xml;HDR=Yes;IMEX=1;"; OleDbConnection con = new OleDbConnection(connString); con.Open(); System.Data.DataTable dtSheet = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); string tname = dtSheet.Rows[0]["TABLE_NAME"].ToString(); OleDbDataAdapter ad = new OleDbDataAdapter(@"Select * FROM [" + tname + "];", con); DataSet dset = new DataSet(); ad.Fill(dset, "ProductOrderBOM"); System.Data.DataTable dt = new System.Data.DataTable(); System.Data.DataTable dttocopy = new System.Data.DataTable(); dt = dset.Tables["ProductOrderBOM"]; if (dt != null || dt.Rows.Count > 0) { dttocopy.Columns.Add("Column1", typeof(string)); dttocopy.Columns.Add("Column2", typeof(string)); dttocopy.Columns.Add("Column3", typeof(string)); dttocopy.Columns.Add("Column4", typeof(string)); dttocopy.Columns.Add("Column5", typeof(string)); dttocopy.Columns.Add("Column6", typeof(string)); dttocopy.Columns.Add("Column7", typeof(string)); dttocopy.Columns.Add("Column8", typeof(string)); dttocopy.Columns.Add("Column9", typeof(string)); for (int iRow = 0; iRow < dt.Rows.Count; iRow++) { dttocopy.Rows.Add(dt.Rows[iRow][0].ToString().Substring(3, 9), dt.Rows[iRow][0].ToString().Substring(12, 4), dt.Rows[iRow][0].ToString().Substring(16, 18), dt.Rows[iRow][0].ToString().Substring(34, 8), dt.Rows[iRow][0].ToString().Substring(42, 4), dt.Rows[iRow][0].ToString().Substring(46, 18), dt.Rows[iRow][0].ToString().Substring(64, 40), dt.Rows[iRow][0].ToString().Substring(104, 3), dt.Rows[iRow][0].ToString().Substring(107, 5)); } foreach (DataRow item in dttocopy.Rows) { if (item.ItemArray[0].ToString() != "" && item.ItemArray[5].ToString() != "" && item.ItemArray[8].ToString() != "") { string prdorderno = item.ItemArray[0].ToString().Trim(); string materialcode = item.ItemArray[5].ToString().Trim(); double qty = Convert.ToDouble(item.ItemArray[8].ToString().Trim()); d1 = callprocedure(prdorderno, materialcode, Math.Round(qty, 2)); if (d1 != null) { if (d1.Tables[0].Rows[0]["Column1"] != null) { WriteStuff(d1.Tables[0].Rows[0]["Column1"].ToString()); } } } } } d1.Clear(); d1.Dispose(); dset.Clear(); dset.Dispose(); dtSheet.Clear(); dtSheet.Dispose(); dt.Clear(); dt.Dispose(); dttocopy.Clear(); dttocopy.Dispose(); ad.Dispose(); con.Close(); con.Dispose(); } catch (Exception Ex) { WriteStuff(Convert.ToString(Ex) + "save_datacomponent function before finally"); } finally { GC.Collect(); GC.WaitForPendingFinalizers(); if (workbooks1 != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks1); if (workbook1 != null) { workbook1.Close(Type.Missing, Type.Missing, Type.Missing); System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook1); } if (xlAppNew1 != null) { xlAppNew1.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlAppNew1); } } 

Esta es la function donde se realiza el trabajo. Cualquier ayuda sería muy apreciable. El método Writestuff () captura la siguiente exception:

  System.Runtime.InteropServices.COMException (0x800706BA): The RPC server is unavailable. (Exception from HRESULT: 0x800706BA) at Microsoft.Office.Interop.Excel.WorkbookClass.Close(Object SaveChanges, Object Filename, Object RouteWorkbook)at MyNewService.MyNewService.SaveData_component(String filename)savedata_component functionSystem.IO.FileNotFoundException: Could not find file 'C:\SUMIT\COMPONENT_TAI_PT1_RMKH_3799_20130603_030504New_03-06-2013-18-07-09-537_04-06-2013-16-42-20-194.DAT'. 

También si me deshago de los methods claros en mi código y el

  System.Runtime.InteropServices.Marshal.FinalReleaseComObject(); 

Otra exception viene en mi path:

  System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used.at Microsoft.Office.Interop.Excel.WorkbookClass.Close(Object SaveChanges, Object Filename, Object RouteWorkbook)at MyNewService.MyNewService.SaveData_component(String filename) 

Realmente no estoy seguro de qué diablos está pasando.

Intenta seguir el segundo método de configuration explicado en este artículo

http://msdn.microsoft.com/en-us/library/aa389286.aspx

http://support.microsoft.com/kb/257757

Mientras que el artículo indica que el soporte de Office 2003 ha finalizado, los contenidos siguen siendo válidos hoy: Microsoft no admite la automation del lado del server de Office. Incluso en la automation del lado del cliente Office interopera es bastante peculiar.

Lo mejor es con una biblioteca como Aspose o NPOI.