System.Runtime.InteropServices.COMException(0x800706BA):RPC服务器不可用。 (从HRESULTexception:0x800706BA)

这个例外

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

当我在任何机器上运行它时收到我的Windows服务,但是当我在testing应用程序中testing它时,不会引发exception。 在我的代码中,我正在做的是将两个.DAT文件转换成.xls文件。 当我通过services.msc启动服务并运行服务时,它运行良好,但是在更新某些行之后,它会抛出exception,然后什么都不会发生。 我有两个独立的function,分别完成这项工作。 示例代码是:

  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); } } 

这是工作完成的function。任何帮助都是非常可观的。 我的Writestuff()方法捕获以下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'. 

另外,如果我摆脱了我的代码中的清晰的方法和

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

另一个例外是我的方式:

  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) 

我真不知道到底发生了什么。

尝试按照本文中介绍的第二种configuration方法

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

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

虽然文章指出Office 2003支持已经结束,但内容仍然有效:Microsoft不支持Office的服务器端自动化。 即使在客户端自动化Office interop也很古怪。

您最好使用Aspose或NPOI等图书馆。