In meiner Form geschlossen Ich bin etwas so einfache wie tunC# Excel Interop: Excel-Prozess bleibt im Speicher, bis Eltern Form
private void btnPrintPickList_Click(object sender, EventArgs e)
{
using (var salesRpt = new SalesOrder(CurrentItem()))
{
salesRpt.CreateSpreadSheet();
salesRpt.Dispose();
}
}
folgte ich habe die "keine 2 Punkte für Excel-Interop-Regel".
protected ExcelSheet(bool documentVisible, XlPageOrientation orientation)
{
ExcelApplication = new Application {Visible = documentVisible};
WorkBooks = ExcelApplication.Workbooks;
WorkBook = WorkBooks.Add(XlSheetType.xlWorksheet);
SheetList = WorkBook.Worksheets;
Orientation = orientation;
WorkSheet = (Worksheet) ExcelApplication.ActiveSheet;
}
public Application ExcelApplication { get; private set; }
public Workbook WorkBook { get; private set; }
public Workbooks WorkBooks { get; private set; }
public Worksheet WorkSheet { get; private set; }
public Sheets SheetList { get; private set; }
public XlPageOrientation Orientation { get; private set; }
die dispose-Methode funktioniert folgendermaßen.
public void Dispose()
{
for (int i = 1; i <= SheetList.Count; i++)
{
Marshal.FinalReleaseComObject(SheetList[i]);
}
//Marshal.FinalReleaseComObject(WorkSheet);
Marshal.FinalReleaseComObject(SheetList);
Marshal.FinalReleaseComObject(WorkBook);
WorkBooks.Close();
Marshal.FinalReleaseComObject(WorkBooks);
ExcelApplication.Quit();
Marshal.FinalReleaseComObject(ExcelApplication);
WorkSheet = null;
SheetList = null;
WorkBook = null;
WorkBooks = null;
ExcelApplication = null;
}
In meinen Tests, wird der EXCEL.exe Prozess nicht konsequent von den aktuellen Prozessen in der Taskleiste entfernt bekommen, sobald die Excel-Tabelle gedruckt wird.
Was mache ich falsch?
zwingen will ich die „using“ Anweisung und die Dispose-Methode verwendet hat aufgerufen und abgeschlossen, aber die EXCEl.exe nicht aus dem Task-Manager, bis ich das Formular ausschließe. Ich werde GC.collect() am Ende der Entsorgung versuchen. –
Hinzufügen von GC.Collect(); Am Ende von Dispose() wurde die EXCEl.exe aus dem Task-Manager entfernt. Ein Punkt obwohl. Ich hatte gehört, dass es nicht ratsam ist, GC.Collect() anzurufen. Ist es bei Interop gültig? –
Leider glaube ich nicht, dass es eine andere Option für dieses Szenario gibt! –