Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MS Word应用程序退出事件仅在Word 2007上第二次后触发_C#_.net_Winforms_Ms Word_Office Interop - Fatal编程技术网

C# MS Word应用程序退出事件仅在Word 2007上第二次后触发

C# MS Word应用程序退出事件仅在Word 2007上第二次后触发,c#,.net,winforms,ms-word,office-interop,C#,.net,Winforms,Ms Word,Office Interop,每当特定的MS Word应用程序实例退出时,我需要运行一些逻辑。我正在使用Microsoft.Office.Interop.Word来: 创建我的Word应用程序实例 打开文档 选择一些表单字段并更改其文本 使Word应用程序可见,以便用户进行交互 在用户交互之后,使用Microsoft.Office.Interop.Word.applicationEvents.quit事件处理程序捕获退出事件(当用户退出Word时) 我正在使用一台现代化的机器开发运行Office 365(Word 16)的应

每当特定的MS Word应用程序实例退出时,我需要运行一些逻辑。我正在使用Microsoft.Office.Interop.Word来:

  • 创建我的Word应用程序实例
  • 打开文档
  • 选择一些表单字段并更改其文本
  • 使Word应用程序可见,以便用户进行交互
  • 在用户交互之后,使用
    Microsoft.Office.Interop.Word.applicationEvents.quit
    事件处理程序捕获退出事件(当用户退出Word时)
  • 我正在使用一台现代化的机器开发运行Office 365(Word 16)的应用程序,在第一次尝试时,事件将在该应用程序上毫无问题地启动

    但是,在运行Word2007的较旧计算机上,我正在开发的程序必须部署在该计算机上,只有在第二次创建实例后才会触发该事件。我觉得很奇怪

    这是我的密码。它在WinForms
    btn\u单击事件中运行

    //实例化word应用程序
    Microsoft.Office.Interop.Word.Application wordApp=null;
    wordApp=新的Microsoft.Office.Interop.Word.Application();
    //打开文件
    Document wordDoc=wordApp.Documents.Open(WordDocumentPath);
    //使用字典填写表单字段
    foreach(字段值中的KeyValuePair字段值)
    {
    FormField FormField=wordDoc.FormFields[fieldValue.Key];
    formField.Select();
    formField.Result=fieldValue.Value;
    }
    //使Word用户界面可见并置于最前面
    可见=true;
    Activate();
    激活();
    //处理退出事件
    ApplicationEvents4_事件wordEvents=wordApp;
    wordEvents.Quit+=OnWordQuit;
    
    OnWordQuit()
    方法中,我将运行一些逻辑,但现在我只使用一个消息框

    //仅在我第二次单击按钮时在Word 2007上运行
    私有void OnWordQuit()
    {
    MessageBox.Show(“OnWordQuit”);
    }
    
    我想问题在于,您正在将事件处理程序
    OnWordQuit
    附加到仅存在于
    btn\u click
    事件处理程序中的局部变量
    wordEvents
    Quit
    属性

    一旦
    btn\u单击事件处理程序完成,此变量就超出范围。在单词真正关闭之前很久,
    wordEvents.Quit
    事件处理程序可能会转到garbadge,并且没有任何响应

    尝试在表单类上声明
    ApplicationEvents4\u Event wordEvents
    字段,并将事件处理程序分配给该字段。您的代码应按以下方式更改:

    //ApplicationEvents4_Event wordEvents = wordApp;
    this.wordEvents.Quit += OnWordQuit;     //  field or property ApplicationEvents4_Event wordEvents should be defined on the form class
    

    通过这种方式,您将确保只要表单处于打开状态,OnWordQuit就会继续存在。

    事件的范围确实是问题所在。不知何故,在Office2007的背景下,该活动第一次被收集,但第二次被保存。后续问题:我仍然在
    btn\u click
    handler中声明所有COM对象(word应用程序和文档)。我只在捕捉到异常时才释放COM对象,因为我相信用户自己会退出应用程序,因为他可以访问UI。我是否应该在OnWordQuit中显式释放COM对象?或者它是多余的?在类似情况下的代码中,我不需要显式地处理COM对象。只要不再需要
    Word.Application
    对象,我就会注意将所有对
    Word.Application
    对象的引用都转换为
    null
    ,并信任垃圾收集器来完成其余的工作。虽然显式处理可能会更快地释放资源并获得一些性能增益。。。