C#Word另存为RPC服务器不可用

C#Word另存为RPC服务器不可用,c#,ms-word,C#,Ms Word,上述代码运行良好,但有时在word\u doc.SaveAs2(参考ob)其给定错误RPC服务器不可用。(HRESULT:0x800706BA的例外)我已经检查了一些建议,但没有一个解决了我的rpc问题 此外,一旦.docx文件被创建,它就会自动打开。我不想在创建文件后打开.docx,因为我的工具一次创建100个文件。如果每个文档都打开,我的电脑将使用如此多的资源。(我只是想以静默方式保存文件) 这是我正在使用的windowsforms-vs2017。如果您没有正确释放代码中生成的所有COM对象

上述代码运行良好,但有时在
word\u doc.SaveAs2(参考ob)其给定错误RPC服务器不可用。(HRESULT:0x800706BA的例外)我已经检查了一些建议,但没有一个解决了我的rpc问题

此外,一旦.docx文件被创建,它就会自动打开。我不想在创建文件后打开.docx,因为我的工具一次创建100个文件。如果每个文档都打开,我的电脑将使用如此多的资源。(我只是想以静默方式保存文件)


这是我正在使用的windowsforms-vs2017。

如果您没有正确释放代码中生成的所有COM对象,那么当代码在不超出范围的情况下执行多次时,就会发生这种情况。该错误表示
应用程序
对象(RPC服务器)仍在使用中,因此无法实例化

例如,代码孤立对象
para
。因此
para
可以“阻止”
word\u app
对象

在使用C#时,最好使用特定对象而不是点符号,这样它们也可以显式释放。(它也更有效。)例如,代替
para.Range.Font

private void CreateDocument(string date, string name, string phone, string father_name, string address, string village, string post, string taluka, string city, string district, string pincode, string product, int price)
        {
string currentPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
            // Get the Word application object.
            Word._Application word_app = new Word.Application();

                // Make Word visible (optional).
                word_app.Visible = true;

                // Create the Word document.
                object missing = Type.Missing;
                Word._Document word_doc = word_app.Documents.Add(
                    ref missing, ref missing, ref missing, ref missing);

                // Create a header paragraph.
                Word.Paragraph para = word_doc.Paragraphs.Add(ref missing);
                //para.Range.Text = "Chrysanthemum Curve";
                object style_name = "Heading 1";
                para.Range.set_Style(ref style_name);
                para.Range.InsertParagraphAfter();

            // Add more text.
                  para.Range.Text = "";
                para.Range.InsertParagraphAfter();

                // Save the current font and start using Courier New.
                string old_font = para.Range.Font.Name;
                para.Range.Font.Name = "Courier New";

            // Add the equations.
            para.Range.Font.Bold = 1;
            para.Range.Font.Size = 16;
                para.Range.Text = "EXPRESS PARCEL WITH COD" +"\v" + "ADVANCE PAYMENT" + "\v" + "CODE NO 560023100235" + "\v" + "BOOKING AT PBC BG 560046" + "\v" + "COD FOR RS " + price + "/ -" + "\v" + "PLEASE COLLECT CASH " + price + "/-" + "\v" + "(" + NumberToWords(price) + ")" + "\v" + "BILLER 5792" + Environment.NewLine + Environment.NewLine + Environment.NewLine;


                // Start a new paragraph and then
                // switch back to the original font.
                para.Range.InsertParagraphAfter();
            para.Range.Font.Name = "Courier New";
            para.Range.Font.Bold = 1;
            para.Range.Font.Size = 16;
            para.Range.Text = "TO\v" + name + father_name + "\v" + address + "\v" + village + "\v" + post + "\v" + taluka + "\v" + city + "\v" + district + "\v" + "PINCODE-" + pincode + "\v" + "MOBILE-" + phone + Environment.NewLine+Environment.NewLine;


            // Start a new paragraph and then
            // switch back to the original font.
            para.Range.InsertParagraphAfter();
            para.Range.Font.Name = "Times New Roman";
            para.Range.Font.Size = 12;
            para.Range.Text = "FROM" + "\v" + "AVK SHOPPING PVT LTD" + "\v" + "NO U16, BHUVANESHWARINAGAR" + "\v" + "MAGADI ROAD BANGALORE - 23" + Environment.NewLine+Environment.NewLine+ Environment.NewLine+ Environment.NewLine;

            // Start a new paragraph and then
            // switch back to the original font.           para.Range.InsertParagraphAfter();
            para.Range.Font.Name = "Times New Roman";
            para.Range.Font.Size = 12;
            para.Range.Text = "PARCEL CONTAINS" + " (" + product + ") " + "AND  THE PARCEL DO" + "\v" + "NOT CONTAIN ANY DANGEROUS ARTICLE PROHIBITED BY" + "\v" + "POSTAL REGULATIONS";


            Thread.Sleep(10000);
            //if(!(File.Exists(@currentPath + name + date + ".docx")))
            //{

            //}
            //else
            //{
            //    //File.Create(@currentPath + name + date + ".docx");

            //}
            string filename = name + "-" + phone + "-" + ".docx";
            MessageBox.Show(currentPath);
            object ob = @currentPath + filename;
            word_doc.SaveAs2(ref ob);
                MessageBox.Show("Document created successfully !");

            // Close.

            Marshal.ReleaseComObject(word_doc);
            Marshal.ReleaseComObject(word_app);
         }

遇到此异常时,是否已关闭文档?这切断了与Word的连接。由于您偶尔会遇到这种情况,而不是始终如一地遇到这种情况(并且您声明首先不希望打开文档),因此我怀疑情况就是这样


无论如何,我建议不要使用Word automation,而只使用直接构成docx文件的压缩XML。除非您必须明确支持Microsoft Word的2007年以前版本,否则我不知道您为什么不能在发布的限制条件下这样做。当我们在2007年进行此转换时,通过自动化创建需要45分钟的文档在同一硬件上花费了15秒,这主要是因为自动化对象必须考虑到您的特定用例之外的许多事情。

请花点时间查看有关在应用程序中提问的站点规则。只允许一个问题。在新问题中提出第二个问题。请检查标记是否正确-阅读有关标记用途的标记信息。此代码运行的上下文是什么?WPF?Winforms?Web项目?它是windows窗体。无论文档是打开的还是关闭的,与Word的连接都不会断开。查看代码,很明显文档没有关闭,Word应用程序也没有退出。就可见性而言,结果是Word应用程序打开时文档可见
Marshal.ReleaseComObject
是断开连接的东西-但并不是所有COM对象都被释放。我尝试了你的建议,但仍然存在相同的问题。还尝试关闭(ref save_changes,ref missing,ref missing);和。快速功能仍然是相同的问题。
Word.Range paraRange = para.Range;
Word.Font paraFont = paraRange.Font;