c# and excel automation - ending the running instance

Ich versuche Excel-Automatisierung über C #. Ich habe alle Anweisungen von Microsoft befolgt, um dies zu tun, habe jedoch immer noch Probleme, die endgültigen Verweise auf Excel zu verwerfen, damit sie geschlossen und vom GC erfasst werden können.

Es folgt ein Codebeispiel. Wenn ich den Codeblock auskommentiere, der Zeilen ähnlich den folgenden enthält:

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

Dann wird die Datei gespeichert und Excel beendet. Andernfalls wird die Datei gespeichert, aber Excel wird als Prozess ausgeführt. Bei der nächsten Ausführung dieses Codes wird eine neue Instanz erstellt und schließlich aufgebaut.

Jede Hilfe wird geschätzt. Vielen Dank.

Das sind die Barebones meines Codes:

<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>
Aktualisieren

Egal was ich versuche, die "saubere" Methode oder die "hässliche" Methode (siehe Antworten unten), die Excel-Instanz hängt immer noch herum, sobald diese Zeile getroffen wird:

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

Wenn ich diese Zeile kommentiere (und natürlich auch die anderen ähnlichen darunter), wird die Excel-App ordnungsgemäß beendet. Sobald eine Zeile pro Zeile unkommentiert ist, bleibt Excel bestehen.

Ich glaube, ich muss vor dem Zuweisen der xl-Variablen überprüfen, ob eine Instanz ausgeführt wird, und mich stattdessen daran beteiligen. Ich habe vergessen zu erwähnen, dass dies ein Windows-Dienst ist, aber das sollte keine Rolle spielen, oder?

Antworten auf die Frage(14)

Ihre Antwort auf die Frage