2013-02-03 98 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) –