C# Excel加载项-注销时未调用OnDisconnection/OnBeginShutdown
我在VisualStudio2008中使用可扩展性IDTExtensibility2接口开发了一个Excel共享加载项 它的功能非常基本。打开工作簿时,它存储在已打开工作簿的列表中;关闭工作簿时,加载项将创建一个新的文本文件,然后向该文件写入一些XML,然后由另一个进程读取该文件,该进程将反序列化XML 加载项在正常操作下工作-因此,如果用户打开和关闭文件,则加载项会执行其应执行的操作;如果用户使用打开的工作簿退出Excel,则加载项会执行其应执行的操作 问题是当用户使用打开的工作簿打开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
有人知道我怎样才能避开这个问题吗?我需要捕获用户注销计算机时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...
}