Excel Addin - 在注销时未调用OnDisconnection / OnBeginShutdown

时间:2010-12-07 15:15:19

标签: c# .net excel-2003 office-interop comaddin

我使用Visual Studio 2008中的扩展性IDTExtensibility2接口开发了Excel的Shared Addin。

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

addin在正常操作下工作 - 所以如果用户打开和关闭文件,那么addin会做它应该做的事情,如果他们用打开的工作簿退出Excel,那么它就会做它应该做的事情。

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

我做了两件事来测试这个:

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

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

  3. 有没有人有任何想法如何解决这个问题?当用户注销他们的机器时,我需要捕获当Excel关闭时...

3 个答案:

答案 0 :(得分:1)

最后的解决方案是挂钩Microsoft.Win32.SystemEvents.SessionEnding,当触发此System事件时,手动调用OnBeginShutdown方法。

答案 1 :(得分:0)

用于导致VB6天内对象〜失败错误的方法。

尝试使用WorkbookBeforeClose或可能的ProtectedViewWindowBeforeClose。

如果我没记错的话,你可能会遇到的一个问题是你无法捕捉到事件被取消的时间,所以如果你用它来清理,我相信你还需要做一些工作激活或打开事件之一,如果用户取消关闭操作,您的插件将可用....

希望这是有道理的。

答案 2 :(得分:0)

我的Outlook 2010插件遇到了同样的问题。这可能与Outlook 2010 does not signal add-ins that it is shutting down

这一事实有关
  

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

     

同样,在Outlook关闭时,使用Microsoft Visual Studio Tools for Office编写的Outlook加载项不再调用 ThisAddin_Shutdown 方法。

如果您仍希望在Outlook 2010关闭时通知您的插件(就像我一样),您需要使用下面的代码来锁定Application的{​​{1}}事件(在任何情况下,您的关机代码仍应以ApplicationEvents_Event_QuitOnDisconnection方式运行:

OnBeginShutdown