c# and excel automation - ending the running instance

Próbuję zautomatyzować program Excel za pomocą C #. Przestrzegałem wszystkich instrukcji Microsoftu dotyczących tego, jak to zrobić, ale wciąż staram się odrzucić ostateczne referencje do Excela, aby je zamknąć i umożliwić GC ich pobranie.

Następuje próbka kodu. Kiedy komentuję blok kodu zawierający wiersze podobne do:

<code>Sheet.Cells[iRowCount, 1] = data["fullname"].ToString();
</code>

następnie plik zapisuje się i Excel kończy pracę. W przeciwnym razie plik zostanie zapisany, ale program Excel zostanie uruchomiony jako proces. Następnym razem, gdy ten kod zostanie uruchomiony, tworzy nową instancję i ostatecznie się buduje.

Każda pomoc jest doceniana. Dzięki.

To jest podstawa mojego kodu:

<code>        Excel.Application xl = null;
        Excel._Workbook wBook = null;
        Excel._Worksheet wSheet = null;
        Excel.Range range = null;

        object m_objOpt = System.Reflection.Missing.Value;

        try
        {
            // open the template
            xl = new Excel.Application();
            wBook = (Excel._Workbook)xl.Workbooks.Open(excelTemplatePath + _report.ExcelTemplate, false, false, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
            wSheet = (Excel._Worksheet)wBook.ActiveSheet;

            int iRowCount = 2;

            // enumerate and drop the values straight into the Excel file
            while (data.Read())
            {

                wSheet.Cells[iRowCount, 1] = data["fullname"].ToString();
                wSheet.Cells[iRowCount, 2] = data["brand"].ToString();
                wSheet.Cells[iRowCount, 3] = data["agency"].ToString();
                wSheet.Cells[iRowCount, 4] = data["advertiser"].ToString();
                wSheet.Cells[iRowCount, 5] = data["product"].ToString();
                wSheet.Cells[iRowCount, 6] = data["comment"].ToString();
                wSheet.Cells[iRowCount, 7] = data["brief"].ToString();
                wSheet.Cells[iRowCount, 8] = data["responseDate"].ToString();
                wSheet.Cells[iRowCount, 9] = data["share"].ToString();
                wSheet.Cells[iRowCount, 10] = data["status"].ToString();
                wSheet.Cells[iRowCount, 11] = data["startDate"].ToString();
                wSheet.Cells[iRowCount, 12] = data["value"].ToString();

                iRowCount++;
            }

            DirectoryInfo saveTo = Directory.CreateDirectory(excelTemplatePath + _report.FolderGuid.ToString() + "\\");
            _report.ReportLocation = saveTo.FullName + _report.ExcelTemplate;
            wBook.Close(true, _report.ReportLocation, m_objOpt);
            wBook = null;

        }
        catch (Exception ex)
        {
            LogException.HandleException(ex);
        }
        finally
        {
            NAR(wSheet);
            if (wBook != null)
                wBook.Close(false, m_objOpt, m_objOpt);
            NAR(wBook);
            xl.Quit();
            NAR(xl);
            GC.Collect();
        }

private void NAR(object o)
{
    try
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
    }
    catch { }
    finally
    {
        o = null;
    }
}
</code>
Aktualizacja

Bez względu na to, co spróbuję, metodę „czystą” lub „brzydką” (patrz odpowiedzi poniżej), instancja programu Excel nadal zawiesza się, gdy tylko ta linia zostanie trafiona:

<code>wSheet.Cells[iRowCount, 1] = data["fullname"].ToString();
</code>

Jeśli komentuję to wyjście (i inne podobne poniżej, oczywiście), aplikacja Excela kończy się wdzięcznie. Gdy tylko jeden wiersz na powyższy komentarz zostanie odkomentowany, Excel trzyma się w miejscu.

Myślę, że będę musiał sprawdzić, czy istnieje uruchomiona instancja przed przypisaniem zmiennej xl i dołączeniem do niej. Zapomniałem wspomnieć, że to usługa Windows, ale to nie powinno mieć znaczenia, prawda?

questionAnswers(14)

yourAnswerToTheQuestion