2016-08-21 6 views
-1

私はオフィスの相互運用機能ライブラリを使用してExcelのシートコンテンツにアクセスするVBフォームアプリケーションを開発しています。以下の簡単な例を取るオフィスでWindows 8に2016Office interopを正しく閉じるアプリケーション

の開発:

Import excel = Microsoft.Office.Interop.Excel 

Private Sub Form_Load(sender As Object, e as EventArgs) Handles MyBase.Load 
    Dim excelApp as excel.Application = New excel.Application 
    excelApp.Quit 
End Sub 

これは、リークが発生するように見えます。フォームがまだ開いている間、コマンドプロンプトからタスクリストを呼び出すと、実行中のExcelアプリケーションが表示されます(私のマシンに15Mのメモリを消費します)。 Excelプロセスは、基本VBアプリケーションがユーザーによって閉じられると終了します。

私のアプリケーションでは、Excelプロセスが終了する前に終了する親プロセスに応じて、受け入れられません。どのようにこれらの優れたプロセスを殺すことができますか?

Import excel = Microsoft.Office.Interop.Excel 

Private Sub Form_Load(sender As Object, e as EventArgs) Handles MyBase.Load 
    Dim excelApp as excel.Application = New excel.Application 
    excelApp.Quit() 
    excelApp = Nothing 
    GC.Collect() 
End Sub 
+0

dupsを投稿する前に** **回答があるものを検索してください... – Codexer

+0

謝罪は、私の検索でそれを見つけませんでした。 – khol

答えて

1

あなたはそのためMarshalクラスを使用することができます(MSDN):私が見つけた

+0

マーシャルが必要な理由とその逆の順序を説明してください。これは、OPが彼の問題を理解するのに役立ちます... – Codexer

+0

私がcomオブジェクトとしてExcelを使用していたとき、そこにプロセスをリリースすることが困難であることを発見しました。多くの実験を経て、フォーラムで何人かの指導を受けた - これが見つけられ、これらのオブジェクトのベストプラクティスであることがわかった。逆の順序が役立った - 私は正確な理由を覚えていない - 多くの時間とビールが発生しました。 MSはこのためにこの機能を構築しました。 – OneFineDay

+2

この記事はSidharth [** here **]でチェックしてください(http://www.siddharthrout.com/2012/08/06/vb-net-two-dot-rule-when-working-with-office-applications -2 /)これを説明します。 COMオブジェクトを扱うときに非常に良い...最初の段落はなぜ... – Codexer

-1

一つのハックは、リファレンスとゴミが収集nullにあります。私はすべてのExcelオブジェクトを逆順で実行することがベスト - >ワークシート、ワークブック、アプリケーションであることを発見しました。

Marshal.FinalReleaseComObject(comObj) 
関連する問題