Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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# Excel加载项-注销时未调用OnDisconnection/OnBeginShutdown_C#_.net_Excel 2003_Office Interop_Comaddin - Fatal编程技术网

C# Excel加载项-注销时未调用OnDisconnection/OnBeginShutdown

C# Excel加载项-注销时未调用OnDisconnection/OnBeginShutdown,c#,.net,excel-2003,office-interop,comaddin,C#,.net,Excel 2003,Office Interop,Comaddin,我在VisualStudio2008中使用可扩展性IDTExtensibility2接口开发了一个Excel共享加载项 它的功能非常基本。打开工作簿时,它存储在已打开工作簿的列表中;关闭工作簿时,加载项将创建一个新的文本文件,然后向该文件写入一些XML,然后由另一个进程读取该文件,该进程将反序列化XML 加载项在正常操作下工作-因此,如果用户打开和关闭文件,则加载项会执行其应执行的操作;如果用户使用打开的工作簿退出Excel,则加载项会执行其应执行的操作 问题是当用户使用打开的工作簿打开Exce

我在VisualStudio2008中使用可扩展性IDTExtensibility2接口开发了一个Excel共享加载项

它的功能非常基本。打开工作簿时,它存储在已打开工作簿的列表中;关闭工作簿时,加载项将创建一个新的文本文件,然后向该文件写入一些XML,然后由另一个进程读取该文件,该进程将反序列化XML

加载项在正常操作下工作-因此,如果用户打开和关闭文件,则加载项会执行其应执行的操作;如果用户使用打开的工作簿退出Excel,则加载项会执行其应执行的操作

问题是当用户使用打开的工作簿打开Excel并注销时。这两个方法:OnDisconnection和OnBeginShutdown似乎根本没有被调用

我做了两件事来测试这一点:

  • 我创建了一个TextWriterTraceListener,它在调用这两个方法时写入日志文件。当Excel正常退出时,会点击它们并将信息记录在日志文件中,但当用户注销时,日志文件中没有任何内容

  • 在这两个使用File.CreateText(filename)的方法中,我创建了一个空白文件。当用户退出Excel时,通常会创建这些文件,但当Excel通过注销关闭时,不会创建这些文件


  • 有人知道我怎样才能避开这个问题吗?我需要捕获用户注销计算机时Excel何时关闭…

    这通常会在VB6天内导致methode~ of object~失败错误

    请在关闭前尝试Workbook,或在关闭前尝试潜在的ProtectedViewWindow

    如果我没记错的话,你可能会遇到这样一个问题,那就是如果事件被取消,你就无法捕获事件发生的时间,所以如果你用这个来清理,我相信你还需要在激活或打开事件中做一些工作,这样当用户取消关闭操作时,你的加载项就可以使用了


    希望这是有意义的。

    最终的解决方案是挂接到
    Microsoft.Win32.SystemEvents.SessionEnding
    ,并在触发此系统事件时手动调用
    OnBeginShutton
    方法。

    我的Outlook 2010插件也有同样的问题。这可能与以下事实有关

    具体而言,Outlook[2010]在快速关机期间不再调用IDTExtensibility2接口的OnBeginShutdown和OnDisconnection方法

    类似地,使用Microsoft Visual Studio Tools for Office编写的Outlook加载项在Outlook关闭时不再调用ThisAddin\u Shutdown方法

    如果您仍然希望在Outlook 2010关闭时(如我所做的那样)通知您的加载项,则需要使用下面类似我的代码锁定
    应用程序的
    ApplicationEvents\u Event\u Quit
    事件(在任何情况下,您的关机代码仍应在
    OnDisconnection
    OnBeginShutdown
    方法中运行):


    我已经在全面使用WorkbookBeforeClose,但作为测试,我更改了它,以便在调用它时将其记录到我的TextWriterTraceListener。当Excel退出时,通常会将调试消息写入日志,但是当Excel通过用户注销关闭时,调试消息也不会写入日志文件,它仍然不会解释为什么OnDisconnection和OnBeginShutdown不被称为。。。
    public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom)
    {
        // As this is an Outlook-only extension, we know the application object will be an Outlook application
        _applicationObject = (Microsoft.Office.Interop.Outlook.Application)application;
    
        // Make sure we're notified when Outlook 2010 is shutting down
        ((Microsoft.Office.Interop.Outlook.ApplicationClass)_applicationObject).ApplicationEvents_Event_Quit += new ApplicationEvents_QuitEventHandler(Connect_ApplicationEvents_Event_Quit);
    }
    
    private void Connect_ApplicationEvents_Event_Quit()
    {
        Array emptyCustomArray = new object[] { };
        OnBeginShutdown(ref emptyCustomArray);
    }
    
    public void OnDisconnection(Extensibility.ext_DisconnectMode disconnectMode, ref System.Array custom)
    {
        addinShutdown();
    }
    
    public void OnBeginShutdown(ref System.Array custom)
    {
        addinShutdown();
    }
    
    private void addinShutdown()
    {
        // Code to run when addin is being unloaded, or Outlook is shutting down, goes here...
    }