2013-02-03 26 views
2

在我启动我的Excel插件,我使用下面的代码保存的句柄Excel窗口:崩溃,同时保留Excel中处理

ExcelWindow = new NativeWindow(); 
ExcelWindow.AssignHandle(new IntPtr(Application.Hwnd)); 

当谈到释放把手,我尽量去做同时关闭:

private void ThisAddInShutdown(object sender, EventArgs e) 
{ 
    try 
    { 
    ExcelWindow.ReleaseHandle(); 
    } 
    catch 
    { 

    } 
} 

当在Debug模式下退出excel时,一切正常。不幸的是,在生产系统上运行此代码时,我遇到了崩溃,无法调试正在进行的操作。我得到一个“窗口正在检查这个问题”窗口,随后消失,就是这样。

这真的没什么大不了的,但我不想用这样的东西来惹恼用户。那么,有没有人知道它可能是什么,以及我该如何调试?谢谢。

+0

尝试捕捉异常(* e.g'赶上(异常前)',并将其写入日志文件或数据库。*)。你甚至可以使用trace输出语句和** WinDbg **。我首先要捕捉源错误是什么,然后确定如何最好地处理它。 – SliverNinja

+0

我不知道你是否注意到,但我有一个围绕导致异常的声明。这是行不通的。 –

+0

请分享实际的'Exception'是什么。确保你在try/catch中包含了你插件中的任何代码。如果你删除了'ReleaseHandle'调用,'Exception'/crash会消失吗?不知道实际的例外情况,我们无法帮您排除故障。 – SliverNinja

回答

1

我的解决办法:

public partial class ThisAddIn 
{ 
    ExcelWindow window; 

    private void ThisAddIn_Startup(object sender, System.EventArgs e) 
    { 
     window = new ExcelWindow(); 

     Application.WorkbookBeforeClose += new Excel.AppEvents_WorkbookBeforeCloseEventHandler(Application_WorkbookBeforeClose); 
     Application.WorkbookActivate += new Excel.AppEvents_WorkbookActivateEventHandler(Application_WorkbookActivate); 
     Application.WorkbookDeactivate += new Excel.AppEvents_WorkbookDeactivateEventHandler(Application_WorkbookDeactivate); 
    } 

    void Application_WorkbookDeactivate(Excel.Workbook Wb) 
    { 
     window.ReleaseHandle(); 
    } 

    void Application_WorkbookActivate(Excel.Workbook Wb) 
    { 
     window.AssignHandle(new IntPtr(Application.Hwnd)); 
    } 

    void Application_WorkbookBeforeClose(Excel.Workbook Wb, ref bool Cancel) 
    { 
     if (Application.Workbooks.Count > 1 || window.Handle == IntPtr.Zero) return; 
     Cancel = true; 
     window.ReleaseHandle(); 
     Dispatcher.CurrentDispatcher.BeginInvoke(new MethodInvoker(Application.Quit), null); 
    } 

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e) 
    { 
    } 

    #region VSTO generated code 

    /// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor. 
    /// </summary> 
    private void InternalStartup() 
    { 
     this.Startup += new System.EventHandler(ThisAddIn_Startup); 
     this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); 
    } 

    #endregion 
} 
+0

'Dispatcher'从哪里来? –

+0

重新调用关闭命令至主线程很重要。所以ReleaseHandle在函数结束的同时完成。所有的调用都会执行完毕。 Dispatcher仅用于调用主线程。 [MSDN Dispatcher](http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.currentdispatcher(v = vs.100).aspx) –