0

OK, I believe this question must have been asked a million times, so apologies for a duplicate, but I cannot figure out why I am still getting a COM object in my Task Manager after running this app.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Tools.Ribbon;
using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.Office.Core;
using System.Reflection;
using System.Runtime.InteropServices;

namespace DataDumpTest
{
public partial class DataDumpRibbon
{
    private Excel.Application _xlApp = null;
    private Excel.Workbook _wb = null;
    private Excel.Worksheet _ws = null;

    private void DataDumpRibbon_Load(object sender, RibbonUIEventArgs e)
    {

    }

    private void LoadOpenFileDialog()
    {
        this.openFileDialog1.Filter = "Excel File (*.XLSX) | *.XLSX";
        this.openFileDialog1.Title = "Ariel's Special Definition";
        this.openFileDialog1.Multiselect = false;
    }

    private void btnDataDump_Click(object sender, RibbonControlEventArgs e)
    {
        LoadOpenFileDialog();

        if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            _xlApp = new Excel.Application();
            _xlApp.Visible = false;
            _xlApp.DisplayAlerts = false;
            _xlApp.ScreenUpdating = false;
            _wb = _xlApp.Workbooks.Open(openFileDialog1.FileName);
            _ws = _wb.Worksheets["Sheet1"];

            _ws.UsedRange.Copy(Type.Missing);
            // get range to paste into
            Excel.Worksheet activeWs = Globals.ThisAddIn.Application.ActiveSheet;
            if (activeWs != null)
            {
                Excel.Range rng = activeWs.Cells[1, 1];
                rng.Select();
                Globals.ThisAddIn.Application.ActiveSheet.Paste(Type.Missing, Type.Missing);
            }

            // clean up
            GC.Collect();
            GC.WaitForPendingFinalizers();
            Marshal.FinalReleaseComObject(_ws);
            _wb.Close(Type.Missing, Type.Missing, Type.Missing);
            Marshal.FinalReleaseComObject(_wb);
            _xlApp.Quit();
            Marshal.FinalReleaseComObject(_xlApp);
        }
    }
}
}

So the COM object I am interested in disposing of is the _xlApp, _wb and _ws that I am opening via OpenfileDialog1. When I am debugging this I can see in my task manager that when I hit the button another Excel instance shows up and doesnt disappear until I stop debugger. Shouldn't it be gone when I released them? Am I missing something here?

Ps. This is just a simple copy/paste from one excel to another, but I want to make sure that I get it right here before I go on to the rest of this app.

1 Answer 1

1

Hmm, try just using:

Marshal.ReleaseComObject(YourComApp);

If it still doesn't go, try nulling out the COM object after running the Marshal on it. I know in powershell I have to dump the variable too.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.