C#:System.Runtime.IntropServices.COMException:使用CLSID检索组件的COM类工厂

时间:2013-01-29 09:31:20

标签: c# visual-studio com ms-word clsid

我正在研究MS字模板生成器,它的工作原理如下:

用户打开一个网页填写一些文本框,标记一些复选框,然后点击按钮,word文档打开(模板我之前定义的所有书签需要),使用他在网页上输入的内容,这是全部在文档中,字段和复选框被标记为标记,他只需要打印文档。它在我的电脑上完美运行

但是当我在服务器上测试它时,发生了一个错误: enter image description here

我的代码: 我已经包含了引用(using Word = Microsoft.Office.Interop.Word;

private void CreateWordDocument(int DepositNo)
        {
            Random RandomClass = new Random();
            int randomInt = RandomClass.Next();
            string templateName = "Form15Template.docx";
            string docFileName = "Form15_" + DepositNo.ToString() + "_" + randomInt.ToString() + ".docx";
            string destenation = "D:\\_Documents\\Form15\\";
            File.Copy(Server.MapPath(@"_Documents/" + templateName), destenation + docFileName, true); // 


            String POBox = "9769";
            String City = "الرياض"; 
            String PostalCode = "11423";
            String Address = "ص.ب " + POBox + " " + City + " " + PostalCode;

            // Modify Checkboxes variables in Doc to true if they have been checked

            if (RadioButtonListResult.SelectedValue.Equals("اجتاز"))
                A = true;
            if (RadioButtonListResult.SelectedValue.Equals("تعديل") || RadioButtonListResult.SelectedValue.Equals("لم يجتز"))
                B = true;
            if (CheckBoxAllElements.Checked)
                AllElements = true;
            if (CheckBoxElements.Checked)
                Elements = true;
            if (CheckBoxEdit.Checked)
                Edit = true;
            if (CheckBoxBoxPage.Checked)
                BoxPage = true;
            if (CheckBoxRequestArabic.Checked)
                RequestArabic = true;
            if (CheckBoxMultiInvention.Checked)
                MultiInvention = true;
            if (CheckBoxRecency.Checked)
                Recency = true;
            if (CheckBoxInventiveStep.Checked)
                InventiveStep = true;
            if (CheckBoxImplemented.Checked)
                Implemented = true;
            if (CheckBoxC.Checked)
                C = true;
            if (CheckBoxD.Checked)
                D = true;

            object bA = "A", bB = "B", bC = "C", bD = "D", bAllElements = "AllElements", bElements = "Elements",
                bRecency = "Recency", bInventiveStep = "InventiveStep", bImplemented = "Implemented",
                bApprove = "Approve", bEdit = "Edit", bBoxPage = "BoxPage", bRequestArabic = "RequestArabic",
                bMultiInvention = "MultiInvention", bObjection = "Objection", bMark = "Mark",
                bRejection = "Rejection";


            //Start Word and open template.
            Word._Application oWord;
            Word._Document oDoc;
            oWord = new Word.Application();
            oWord.Visible = true;
            object FileName = @"C:\Users\aalhammad\Documents\Visual Studio 2010\Projects\FormEditing\FormEditing\_Documents\Form15Template.docx";
            object oMissing = System.Reflection.Missing.Value;
            oDoc = oWord.Documents.Open(ref FileName, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);

            // ============================================== CheckBoxes ====================================================
            // Modifying CheckBoxes in Document

            oDoc.FormFields.get_Item(ref bA).CheckBox.Value = A;
            oDoc.FormFields.get_Item(ref bB).CheckBox.Value = B;
            oDoc.FormFields.get_Item(ref bC).CheckBox.Value = C;
            oDoc.FormFields.get_Item(ref bD).CheckBox.Value = D;
            oDoc.FormFields.get_Item(ref bAllElements).CheckBox.Value = AllElements;
            oDoc.FormFields.get_Item(ref bElements).CheckBox.Value = Elements;
            oDoc.FormFields.get_Item(ref bRecency).CheckBox.Value = Recency;
            oDoc.FormFields.get_Item(ref bInventiveStep).CheckBox.Value = InventiveStep;
            oDoc.FormFields.get_Item(ref bImplemented).CheckBox.Value = Implemented;
            oDoc.FormFields.get_Item(ref bApprove).CheckBox.Value = Approve;
            oDoc.FormFields.get_Item(ref bEdit).CheckBox.Value = Edit;
            oDoc.FormFields.get_Item(ref bBoxPage).CheckBox.Value = BoxPage;
            oDoc.FormFields.get_Item(ref bRequestArabic).CheckBox.Value = RequestArabic;
            oDoc.FormFields.get_Item(ref bMultiInvention).CheckBox.Value = MultiInvention;
            oDoc.FormFields.get_Item(ref bObjection).CheckBox.Value = Objection;
            oDoc.FormFields.get_Item(ref bMark).CheckBox.Value = Mark;
            oDoc.FormFields.get_Item(ref bRejection).CheckBox.Value = Rejection;


            // ============================================== BookMarks =====================================================

            String ApplicantName = "شركة الزيت العربية السعودية",
                AgentName = "مكتب سليمان العمار للمحاماة والاستشارات القانونية",
                AppDate = "13/01/2013",
                Title = "حماية خط تدفق رأس بئر‏ ونظام اختبار باستخدام وحدة تحكم في سرعة مضخة كهربائية مغمورة وصمام فاصل يستخدم عند الطوارئ";

            // find bookmark

            object oBookmark = "DepositNO"; // name of bookmark in doc
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = GetDepositNO(DepositNo);
            oBookmark = "AppDate";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = AppDate;
            oBookmark = "Title";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = Title;
            oBookmark = "ApplicantName";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = ApplicantName; 
            oBookmark = "AgentName";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = AgentName;
            oBookmark = "Address";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = Address;
            oBookmark = "AgentName01";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = AgentName;
            oBookmark = "Times";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = Times;
            oBookmark = "NumOfElements";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = NumOfElements;
            oBookmark = "txtElements";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = txtElements;
            oBookmark = "txtRecency";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = txtRecency;
            oBookmark = "txtInventiveStep";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = txtInventiveStep;
            oBookmark = "txtImplemented";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = txtImplemented;
            oBookmark = "ElementsC";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = ElementsC;
            oBookmark = "ElementsD1";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = ElementsD1;
            oBookmark = "ElementsD2";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = ElementsD2;
            oBookmark = "txtBoxPage";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = txtBoxPage;
            oBookmark = "Fees";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = Fees;
            oBookmark = "DepositNO01";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = GetDepositNO01(DepositNo);
            oBookmark = "ExamTime";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = ExamTime;
            oBookmark = "ExamTime01";
            oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = ExamTime;
object saveFileName = "D:\\_Documents\\Form15\\" + "Form15 " + DepositNo.ToString() + "_" + randomInt.ToString() + ".docx";

            oDoc.SaveAs(ref saveFileName, ref oMissing, ref oMissing,
            ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
            ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
            ref oMissing, ref oMissing, ref oMissing);

知道我正在努力:Visual Studios C#2010和Microsoft .NET Framework 4.0 在服务器上它是:Visual Studio C#2005,MS Framework 2.0

知道问题可能是什么?

3 个答案:

答案 0 :(得分:1)

您的问题的临时解决方案是安装Microsoft Word(确保在安装过程中选择.NET可编程性支持组件)并至少以运行Web应用程序的用户身份运行应用程序。该用户需要是具有桌面的交互式用户。

请注意,如果要自动化Office,则需要安装Office - 您可能部署的互操作程序集只是一个包装器,不包含实际代码。

但是,请记住,Microsoft Office应用程序的非交互式自动化非常棘手,并且不受Microsoft正式支持。与MSDN中的自动化示例相比,它需要更多的代码才能使事物变得可靠和稳定。创建交互式桌面,维护单词实例或阻止弹出消息的会计等都需要在代码中明确实现。

更好的替代方法是使用Open XML SDK创建文档(尽管应该知道当前SDK版本中的生成不是线程安全的。)

答案 1 :(得分:1)

您在网络服务器中使用的用户帐户存在问题,您必须更改它:

//
// MessageId: CO_E_RUNAS_LOGON_FAILURE
//
// MessageText:
//
// The server process could not be started because the configured identity 
// is incorrect. Check the username and password.
//
#define CO_E_RUNAS_LOGON_FAILURE         _HRESULT_TYPEDEF_(0x8000401AL)

请注意,Microsoft 强烈不鼓励在Web服务器上使用Office程序。您将为访问您网页的每个用户创建一个Word实例。 Word是一个进程,旨在仅用于个人工作站。即使在那里,它也像单个进程一样阻止用户启动多个Word实例。这在像你这样的互操作场景中不起作用。在您的服务器为多个Word副本强加的大量系统需求做出贡献之前,它不会超过少数访问者。

答案 2 :(得分:0)

Check dcomcnfg查看它是否设置为“交互式用户”。