使用 Visual Studio .NET 用戶端執行自動化功能後不退出 Office 應用程式

來源:互聯網
上載者:User
癥狀使用 Microsoft Visual Basic .NET 或 Microsoft Visual C# .NET 使 Microsoft Office 應用程式執行自動化功能後,當調用 Quit 方法時,不退出 Office 應用程式。原因當 Visual Studio .NET 從Managed 程式碼調用 COM 物件時,它自動建立運行庫可調用封裝 (RCW)。RCW 封送 .NET 應用程式和 COM 物件之間的調用。RCW 保留著對 COM 物件的引用計數。因此,如果 RCW 上沒有將所有引用全部釋放,COM 物件就不會退出。解決方案要確保退出 Office 應用程式,自動化代碼一定要滿足以下條件:將每個對象聲明為新變數。例如,將下面的程式碼oBook = oExcel.Workbooks.Add()更改為以下內容:dim oBooks as Excel.WorkbooksoBooks = oExcel.WorkbooksoBook = oBooks.Add()停止使用某個對象時,應使用 System.Runtime.InteropServices.Marshal.ReleaseComObject。這樣可以減少 RCW 的引用計數。要釋放對變數的引用,請將變數設定為等於 Nothing 或 Null。使用 Office 應用程式物件的 Quit 方法通知伺服器關閉。狀態這種現象是設計導致的。更多資訊重現問題的步驟啟動 Visual Studio .NET。在檔案菜單上,單擊建立,然後單擊項目。在 Visual Basic 項目下,選擇 Windows 應用程式,然後單擊確定。預設情況下會建立 Form1。添加對 Microsoft Excel 物件程式庫的引用。為此,請按照下列步驟操作:在項目菜單上,單擊添加引用。在 COM 選項卡上,找到 Excel 物件程式庫,然後單擊選擇。對於 Microsoft Excel 2002:Microsoft Excel 10.0 物件程式庫注意:如果您尚未執行此操作,Microsoft 建議您下載並安裝 Microsoft Office XP 主 Interop 程式集 (PIA)。 有關 Office XP PIA 的其他資訊,請單擊下面的文章編號,以查看 Microsoft 知識庫中相應的文章:328912  Microsoft Office XP 主 interop 程式集 (PIA) 可供下載對於 Microsoft Office Excel 2003:Microsoft Excel 11.0 物件程式庫在添加引用對話方塊中單擊確定,接受您的選擇。在視圖菜單上,單擊工具箱,然後將一個按鈕控制項拖到 Form1 上。雙擊 Button1。出現該表單的代碼視窗。將以下代碼添加到 Form1.vb 的頂部:Imports Microsoft.Office.Interop將代碼視窗中的以下代碼    Private Sub Button1_Click(ByVal sender As System.Object, _       ByVal e As System.EventArgs) Handles Button1.Click    End Sub替換為:Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click    Dim oApp As New Excel.Application()    Dim oBook As Excel.Workbook = oApp.Workbooks.Add    Dim oSheet As Excel.Worksheet = oApp.ActiveSheet    oSheet = Nothing    oBook.Close(False)    oBook = Nothing    oApp.Quit()    oApp = Nothing    Debug.WriteLine("Sleeping...")    System.Threading.Thread.Sleep(5000)    Debug.WriteLine("End Excel")End Sub按 F5,運行該應用程式。開啟 Windows 工作管理員。在 Visual Studio 中,顯示“輸出”視窗,查看調試資訊。單擊命令按鈕並注意 Excel.exe 的一個執行個體會顯示在進程列表中。即使在應用程式停止休眠後,Excel 的執行個體仍然會在工作清單中運行。關閉對話方塊並注意 Excel 會從進程列表中消失。執行“解決辦法”部分的步驟後,Office 應用程式會在釋放最後一個變數後退出。將第 5 步中的函數替換為以下代碼:  Private Sub NAR(ByVal o As Object)    Try      System.Runtime.InteropServices.Marshal.ReleaseComObject(o)    Catch    Finally      o = Nothing    End Try  End SubPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click    Dim oApp As New Excel.Application()    Dim oBooks As Excel.Workbooks = oApp.Workbooks    Dim oBook As Excel.Workbook = oBooks.Add    Dim oSheet As Excel.Worksheet = oApp.ActiveSheet    NAR(oSheet)    oBook.Close(False)    NAR(oBook)    NAR(oBooks)    oApp.Quit()    NAR(oApp)    Debug.WriteLine("Sleeping...")    System.Threading.Thread.Sleep(5000)    Debug.WriteLine("End Excel")End Sub如果您正在使用 Visual C# .NET,請引用 NAR() 函數的以下代碼:private void NAR(object o){    try     {        System.Runtime.InteropServices.Marshal.ReleaseComObject(o);    }    catch {}    finally     {        o = null;    }}疑難解答請注意,如果您按照“重現此問題的步驟”一節中的說明執行操作後,伺服器仍然沒有關閉,則在您釋放最後一個對象後,可以使用 GC.Collect() 和 GC.WaitForPendingFinalizers() 方法。因為運行庫對 RCW 執行垃圾收集,所以 GC.Collect() 方法會強制記憶體回收行程運行,並且會釋放 RCW 仍然擁有的任何引用。GC.Collect() 方法嘗試回收可用的最大記憶體。注意,這不能保證所有記憶體都被回收。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.